来自画廊,照片和相机的图像总是不起作用

时间:2016-09-21 08:00:00

标签: android image

  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 ????检查下面的代码。问题是,当从照相机中选择图像时,从相机中拍摄时,它的工作原理。但是当从gallery文件夹中选择时,由于某种原因它不起作用。还有一些客户在sony 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);
    }
}

1 个答案:

答案 0 :(得分:0)

这就是我这样做的方式,它有效:

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)
        }
    }