【问题标题】:Image from gallery, photos and camera not working always来自图库、照片和相机的图像始终无法正常工作
【发布时间】:2016-09-21 18:36:54
【问题描述】:
  final List<Intent> cameraIntents = new ArrayList<Intent>();
                final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                final PackageManager packageManager = getPackageManager();
                final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
                for (ResolveInfo res : listCam) {
                    final String packageName = res.activityInfo.packageName;
                    final Intent intent = new Intent(captureIntent);
                    intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                    intent.setPackage(packageName);
                    cameraIntents.add(intent);
                }
                Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI);   galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
                startActivityForResult(chooserIntent, 1);

所以,这就是我打开相机或拍照的方式。我如何在 onactivityresult 上阅读它们????检查下面的代码。问题是,当从照片中选择图像时它可以工作,从相机拍摄时它可以工作。但是当从图库文件夹中选择时,由于某种原因它不起作用。还有一些客户报告我在索尼 xperia e4 手机上的问题。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        if (resultCode == Activity.RESULT_OK && requestCode == 1
                ) {
            Bitmap bm = null;
            try
            {
                Bundle extras = data.getExtras();
                bm = (Bitmap) extras.get("data");
            }
            catch(Exception e)
            {
                try
                {
                    Uri selectedImage = data.getData();
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inJustDecodeBounds = false;
                    options.inPreferredConfig = Bitmap.Config.RGB_565;
                    options.inDither = true;
                    String[] filePathColumn = {MediaStore.Images.Media.DATA};
                    Cursor cursor = getContentResolver().query(
                            selectedImage, filePathColumn, null, null, null);
                    cursor.moveToFirst();
                    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                    String filePath = cursor.getString(columnIndex);
                    cursor.close();
                    Common.setBitmap(null);
                    bm = BitmapFactory.decodeFile(filePath);           
   BitmapFactory.decodeFile(Common.getRealPathFromURI(data.getData(), rootView.getContext()), bounds);
                    if(bm == null)
                        bm = BitmapFactory.decodeFile(Common.getRealPathFromURI(selectedImage, AddStoreActivity.this), options);
                    if(bm == null)
                        bm = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage);
                }
                catch(Exception e1)
                {
                }
            }        
        }
    } catch (Exception e) {
    }
}





 public static String getRealPathFromURI(Uri contentURI, Context cont) {
    Cursor cursor = cont.getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        return contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaColumns.DATA);
        return cursor.getString(idx);
    }
}

【问题讨论】:

    标签: android image


    【解决方案1】:

    这就是我这样做的方式,它的工作原理:

    private void displayAddPhotoDialog() {
            final CharSequence[] items = getResources().getStringArray(R.array.photo_dialog_options);
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(getResources().getString(R.string.photo_dialog_title));
            builder.setItems(items, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    if (item == TAKE_PHOTO_OPTION) {
                        dispatchTakePictureIntent();
                    } else if (item == CHOOSE_FROM_LIBRARY_OPTION) {
                        dispatchPickImageIntent();
                    } else if (item == CANCEL_OPTION) {
                        dialog.dismiss();
                    }
                }
            });
            builder.show();
        }
    
    
    protected void dispatchTakePictureIntent() {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
                File photoFile = null;
                try {
                    photoFile = createImageFile();
                    imageUri = Uri.fromFile(photoFile);
                } catch (IOException ex) {
                    Toast.makeText(getActivity(), ex.toString(), Toast.LENGTH_SHORT).show();
                }
                if (photoFile != null) {
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);
                }
            } else {
                Toast.makeText(getActivity(), R.string.no_camera_error_message, Toast.LENGTH_SHORT).show();
            }
        }
    
    
        protected void dispatchPickImageIntent() {
            Intent intent = new Intent();
            intent.setType("image/*");
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                intent.setAction(Intent.ACTION_GET_CONTENT);
            } else {
                intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
            }
            startActivityForResult(Intent.createChooser(intent, getString(R.string.select_picture)), GALLERY_REQUEST_CODE);
        }
    

    你的 onActivityResult 方法应该是这样的:

    @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
                photoReceivedFromCamera = true;
                getActivity().getContentResolver().notifyChange(imageUri, null);
                Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                mediaScanIntent.setData(imageUri);
                getActivity().sendBroadcast(mediaScanIntent);
                //do want you want with the uri(taken photo)
            } else if (requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_CANCELED) {
                //The user cancelled the take picture action...
                if (!photoReceivedFromCamera) {
                    //If the user has not previously taken a picture,
                    //this means he is cancelling the take photo process
                    onCancelTakePicture();
                }
            } else if (requestCode == GALLERY_REQUEST_CODE && data != null && data.getData() != null) {
                Uri uri = data.getData();
               //do want you want with the uri(selected image)
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      相关资源
      最近更新 更多