您的位置:首页 > 移动开发 > Android开发

android客户端学习-拍照或从相册选择图片并裁剪

2015-10-13 14:29 597 查看
1.在activity中定义变量

private final int RESULT_PHOTO_KITKAT = 0;//图库返回

 private final int RESULT_PHOTO = 1;//相册返回

 private final int RESULT_CAMERA = 2;//相机返回

 private final int RESULT_CROP = 3;//裁剪

 private final int RESULT_ADBAR = 5;//返回

 

 private int outputX = 106;   // 裁剪的宽度

 private int outputY = 106;   // 裁剪高度

 private int aspectX = 2;   // 宽的比例

 private int aspectY = 2;  // 高的比例

 

2.定义调用的方法:getImage();

private void getImage(){

        String[] choices; 

        choices = new String[2]; 

        choices[0] = "拍照";

        choices[1] = "相册";

  ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, choices); 

  AlertDialog.Builder builder = new AlertDialog.Builder(this); 

        builder.setTitle("选择"); 

        builder.setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() { 

            public void onClick(DialogInterface dialog, int which) { 

                dialog.dismiss(); 

                switch (which) { 

                case 0:{ 

                    String status=Environment.getExternalStorageState(); 

                    if(status.equals(Environment.MEDIA_MOUNTED)){//判断是否有SD卡 

                  

                  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);

                  intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg")));

                  System.out.println("=============" + Environment.getExternalStorageDirectory()); 

                  PersonInfoActivity.this.startActivityForResult(intent,RESULT_CAMERA);

                    } 

                    else{ 

                        toast("没有SD卡");

                    } 

                    break; 

                     

                } 

                case 1: 

                 // 从相册中去获取  

                 if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.KITKAT){ 

                  Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);

                     intent.addCategory(Intent.CATEGORY_OPENABLE);

                     intent.setType("image/*");

                     startActivityForResult(intent, RESULT_PHOTO_KITKAT); 

                 }else{

                  getPhoto();

                 }

                    break; 

                } 

            } 

        }); 

        builder.setNegativeButton("返回", new DialogInterface.OnClickListener() { 

     

            @Override 

            public void onClick(DialogInterface dialog, int which) { 

                dialog.dismiss(); 

            } 

             

        }); 

        builder.create().show();

 }

 

 private void getPhoto(){    

     Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);

     intent.addCategory(Intent.CATEGORY_OPENABLE);

     intent.setType("image/*"); 

     intent.putExtra("crop", "true"); 

     //裁剪框比例 

     intent.putExtra("aspectX", aspectX); 

     intent.putExtra("aspectY", aspectY); 

     //图片输出大小 

     intent.putExtra("outputX", outputX); 

     intent.putExtra("outputY", outputY); 

     intent.putExtra("scale", true); 

     intent.putExtra("return-data", true); 

     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg"))); 

     intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 

     //不启用人脸识别 

     intent.putExtra("noFaceDetection", false);  

     if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.KITKAT){                 

         startActivityForResult(intent, RESULT_PHOTO_KITKAT);   

  }else{               

         startActivityForResult(intent, RESULT_PHOTO);  

  }

 }

 

 /** 相机裁剪 */

 private void getCrop(Uri uri){

  Intent intent = new Intent("com.android.camera.action.CROP"); 

  intent.setDataAndType(uri, "image/*"); 

  intent.putExtra("crop", "true");//可裁剪 

  intent.putExtra("aspectX", aspectX); 

  intent.putExtra("aspectY", aspectY); 

  intent.putExtra("outputX", outputX); 

  intent.putExtra("outputY", outputY); 

  intent.putExtra("scale", true); 

  intent.putExtra("return-data", false);//若为false则表示不返回数据 

  intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg"))); 

  intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 

  intent.putExtra("noFaceDetection", true);  

  startActivityForResult(intent, RESULT_CROP);

 }

 

 /**

 * 判断手机是否有SD卡。

 *

 * @return 有SD卡返回true,没有返回false。

 */

 public boolean hasSDCard() {

  return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());

 }

 

 /**

  * <br>功能简述:4.4及以上获取图片的方法

  * <br>功能详细描述:

  * <br>注意:

  * @param context

  * @param uri

  * @return

  */

 @TargetApi(Build.VERSION_CODES.KITKAT)

 public static String getPath(final Context context, final Uri uri) {

  final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

  // DocumentProvider

  if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

   // ExternalStorageProvider

   if (isExternalStorageDocument(uri)) {

    final String docId = DocumentsContract.getDocumentId(uri);

    final String[] split = docId.split(":");

    final String type = split[0];

    if ("primary".equalsIgnoreCase(type)) {

     return Environment.getExternalStorageDirectory() + "/" + split[1];

    }

   }

   // DownloadsProvider

   else if (isDownloadsDocument(uri)) {

    final String id = DocumentsContract.getDocumentId(uri);

    final Uri contentUri = ContentUris.withAppendedId(

      Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

    return getDataColumn(context, contentUri, null, null);

   }

   // MediaProvider

   else if (isMediaDocument(uri)) {

    final String docId = DocumentsContract.getDocumentId(uri);

    final String[] split = docId.split(":");

    final String type = split[0];

    Uri contentUri = null;

    if ("image".equals(type)) {

     contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

    } else if ("video".equals(type)) {

     contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

    } else if ("audio".equals(type)) {

     contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

    }

    final String selection = "_id=?";

    final String[] selectionArgs = new String[] { split[1] };

    return getDataColumn(context, contentUri, selection, selectionArgs);

   }

  }

  // MediaStore (and general)

  else if ("content".equalsIgnoreCase(uri.getScheme())) {

   // Return the remote address

   if (isGooglePhotosUri(uri))

    return uri.getLastPathSegment();

   return getDataColumn(context, uri, null, null);

  }

  // File

  else if ("file".equalsIgnoreCase(uri.getScheme())) {

   return uri.getPath();

  }

  return null;

 }

 public static String getDataColumn(Context context, Uri uri, String selection,

   String[] selectionArgs) {

  Cursor cursor = null;

  final String column = "_data";

  final String[] projection = { column };

  try {

   cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,

     null);

   if (cursor != null && cursor.moveToFirst()) {

    final int index = cursor.getColumnIndexOrThrow(column);

    return cursor.getString(index);

   }

  } finally {

   if (cursor != null)

    cursor.close();

  }

  return null;

 }

 /**

  * @param uri The Uri to check.

  * @return Whether the Uri authority is ExternalStorageProvider.

  */

 public static boolean isExternalStorageDocument(Uri uri) {

  return "com.android.externalstorage.documents".equals(uri.getAuthority());

 }

 /**

  * @param uri The Uri to check.

  * @return Whether the Uri authority is DownloadsProvider.

  */

 public static boolean isDownloadsDocument(Uri uri) {

  return "com.android.providers.downloads.documents".equals(uri.getAuthority());

 }

 /**

  * @param uri The Uri to check.

  * @return Whether the Uri authority is MediaProvider.

  */

 public static boolean isMediaDocument(Uri uri) {

  return "com.android.providers.media.documents".equals(uri.getAuthority());

 }

 /**

  * @param uri The Uri to check.

  * @return Whether the Uri authority is Google Photos.

  */

 public static boolean isGooglePhotosUri(Uri uri) {

  return "com.google.android.apps.photos.content".equals(uri.getAuthority());

 }

 

3.回调

 

@Override

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  super.onActivityResult(requestCode, resultCode, data);

  if (resultCode == Activity.RESULT_OK) {

   Uri url = null;

   Bitmap bitmap = null;

   switch (requestCode) {

   case RESULT_PHOTO_KITKAT:

    String mAlbumPicturePath = getPath(getApplicationContext(), data.getData());

    url = Uri.fromFile(new File(mAlbumPicturePath));

    getCrop(url);

    break;

   case RESULT_PHOTO:

    Object object = data.getExtras().get("data");

    if (object instanceof Bitmap){

     Bitmap cameraBitmap = (Bitmap) object;

     person_logo.setImageBitmap(cameraBitmap);

    }

    break;

   case RESULT_CAMERA:

    url = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg"));

    getCrop(url);

    break;

   case RESULT_CROP:

    try {

     url = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg"));

     bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(url));

     person_logo.setImageBitmap(bitmap);

    } catch (FileNotFoundException e) {

     e.printStackTrace();

    }

    break;

   case RESULT_ADBAR:

    

    break;

   default:

    break;

   }

  }

 }

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: