onActivityResult 返回 Intent data.getData();仅在棉花糖和棒棒糖中始终为空 [英] onActivityResult returning Intent data.getData(); always Null Only in Marshmallow and Lollipop

查看:31
本文介绍了onActivityResult 返回 Intent data.getData();仅在棉花糖和棒棒糖中始终为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

阅读我的完整代码.它在除 MarshmallowLollipop 之外的所有手机上都能完美运行.在 MarshmallowLollipop 手机中唯一的问题是 data.getData() 仅在 null 的情况下返回 null强>图片捕获.如果我捕获视频,它工作正常.我有 4 个案例 -

Read My Whole Code. It is working perfectly on every Phone except Marshmallow and Lollipop. In Marshmallow and Lollipop phones Only problem is coming in data.getData() returning null only in case of Picture Captured. It is working fine if i capture Video .I have 4 cases -

  1. 从图库中选择图片并在 Imageview 中显示其缩略图 - 工作正常.

  1. Choosing Picture from Gallery and show its thumbnail in Imageview - Working Fine.

从相机捕获图片并在 Imageview 中显示其缩略图 - MarshmallowLollipop 中的 不工作>.

Capturing Picture from Camera and show its thumbnail in Imageview - NOT WORKING in Marshmallow and Lollipop.

从图库中选择视频并在 Imageview 中显示其缩略图 - 工作正常.

Choosing Video from Gallery and show its thumbnail in Imageview - Working Fine.

3.Capturing Video from Camera and show its thumbnail in Imageview - 工作正常.

3.Capturing Video from Camera and show its thumbnail in Imageview - Working Fine.

现在有很多解决方案,但看起来都不令人满意,如果代码在视频捕获的情况下工作正常,那么为什么它不能用于图像捕获?是错误还是我在某处做错了?

Now There are many solutions but neither of them looks satisfactory,If code is working fine in case of Video Capturing then why its NOT working for Image Capturing?Is it a Bug or I am doing wrong somewhere?

这是我的代码.我已经评论了发生崩溃的一行-

Here is My Code . I have commented a line where crash happens-

 @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      int THUMBSIZE = 120;
      switch (requestCode){


        case RESULT_LOAD_IMAGE:


            if (resultCode==RESULT_OK){
                String column_Name= MediaStore.Images.Media.DATA;
                String picturePath=getPath(column_Name,data.getData());
                Bitmap orientedBitmap = ExifUtil.rotateBitmap(picturePath, BitmapFactory.decodeFile(picturePath));
                Drawable fullpic=new BitmapDrawable(getResources(),ThumbnailUtils.extractThumbnail(orientedBitmap, THUMBSIZE, THUMBSIZE));
                thumbnailview.setBackground(fullpic);
                editText.setText(picturePath);
                picker.setVisibility(View.VISIBLE);
                thumbnailview.setClickable(false);

            }
            break;

        case REQUEST_IMAGE_CAPTURE:

            if (resultCode==RESULT_OK){
                String picturePath="";
                String column_Name=MediaStore.Images.Media.DATA;

                picturePath=getPath(column_Name,data.getData());

                    //My app Crashes here because in Marshmallow data.getData() is always null.

                Bitmap orientedBitmap = ExifUtil.rotateBitmap(picturePath, BitmapFactory.decodeFile(picturePath));
                Drawable fullpic=new BitmapDrawable(getResources(),ThumbnailUtils.extractThumbnail(orientedBitmap, THUMBSIZE, THUMBSIZE));
                thumbnailview.setBackground(fullpic);
                editText.setText(picturePath);
                picker.setVisibility(View.VISIBLE);
                thumbnailview.setClickable(false);


            }
            break;

        case RESULT_LOAD_VIDEO:

            if (resultCode==RESULT_OK){
                String column_Name=MediaStore.Video.Media.DATA;
                String videoPath=getPath(column_Name,data.getData());
                Drawable fullpic=new BitmapDrawable(getResources(),ThumbnailUtils.createVideoThumbnail(videoPath,MediaStore.Video.Thumbnails.MINI_KIND));
                thumbnailview.setBackground(fullpic);
                editText.setText(videoPath);
                picker.setVisibility(View.VISIBLE);
                thumbnailview.setClickable(false);


            }
            break;

        case REQUEST_VIDEO_CAPTURE:

            if (resultCode==RESULT_OK){
                String column_Name=MediaStore.Video.Media.DATA;
                String videoPath=getPath(column_Name,data.getData());
                Drawable fullpic=new BitmapDrawable(getResources(),ThumbnailUtils.createVideoThumbnail(videoPath,MediaStore.Video.Thumbnails.MINI_KIND));
                thumbnailview.setBackground(fullpic);
                editText.setText(videoPath);
                picker.setVisibility(View.VISIBLE);
                thumbnailview.setClickable(false);


            }
            break;
    }

    if (picker != null) {
        picker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                OpenDialog();
            }
        });
    }

}


private String getPath(String column_Name,Uri uri){

    String[] projection = {column_Name};
    String path = "";
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    int column_index_data ;
    if (cursor != null) {
        column_index_data = cursor.getColumnIndexOrThrow(column_Name);
        cursor.moveToFirst();
        path = cursor.getString(column_index_data);
        cursor.close();
    }

    return path;
}

private void OpenDialog(){
    dialogBox.setTitle("Select an Action");
    dialogBox.setMessage("Choose Picture or Video");

    dialogBox.setPositiveButton("Picture", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (check_Permissions()){
                OpenCameraDialog();
            }
            else {
                request_Permissions();
                CAMERA_DIALOG_PERMISSION=1;

            }
        }
    });

    dialogBox.setNegativeButton("Video", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (check_Permissions()){
                OpenVideoDialog();
            }
            else {
                request_Permissions();
                VIDEO_DIALOG_PERMISSION=1;
            }

        }
    });

    dialogBox.show();

}



private void OpenCameraDialog(){

    dialogBox.setTitle("Select an Action");
    dialogBox.setMessage("Choose Picture From");

    dialogBox.setPositiveButton("Gallery", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            final Intent galleryintent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(galleryintent, RESULT_LOAD_IMAGE);
        }
    });

    dialogBox.setNegativeButton("Camera", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);

        }
    });

    dialogBox.show();

}

private void OpenVideoDialog(){

    dialogBox.setTitle("Select an Action");
    dialogBox.setMessage("Choose Video From");

    dialogBox.setPositiveButton("Gallery", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            final Intent galleryintent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(galleryintent, RESULT_LOAD_VIDEO);
        }
    });

    dialogBox.setNegativeButton("Camera", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            final Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

            if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
                startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
            }
        }
    });
    dialogBox.show();

}

private boolean check_Permissions(){

    boolean GRANTED;

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) +
            ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) +
            ContextCompat.checkSelfPermission(this,Manifest.permission.RECORD_AUDIO) +
            ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
        GRANTED=false;

    }
    else {
        GRANTED=true;
    }
    return GRANTED;
}

private void request_Permissions(){
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO},
            REQUEST_FOR_PERMISSION);

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode){

        case REQUEST_FOR_PERMISSION:

            if ((grantResults.length>0)&& (grantResults[0] +grantResults[1]+grantResults[2]+grantResults[3]== PackageManager.PERMISSION_GRANTED)){

                if (CAMERA_DIALOG_PERMISSION==1){
                    OpenCameraDialog();
                    CAMERA_DIALOG_PERMISSION=0;
                }
                else if (VIDEO_DIALOG_PERMISSION==1){
                    OpenVideoDialog();
                    VIDEO_DIALOG_PERMISSION=0;
                }

            }
            else {
                Toast.makeText(this, "Please GRANT Permissions", Toast.LENGTH_SHORT).show();
            }

    }

}

推荐答案

As,suggested by @CommonsWare -

As,suggested by @CommonsWare -

相机应用不需要返回uri.

Camera App do not need to return uri.

还有,

您需要告诉相机应用在哪里写入图像.

You need to tell Camera app where to write image.

所以,我用-替换了我的代码

So, i replaced my code with-

 final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            pictureUri=getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,pictureUri);
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);

onActivityResult -

 case REQUEST_IMAGE_CAPTURE:

            if (resultCode==RESULT_OK){
                String picturePath="";
                String column_Name= MediaStore.Images.Media.DATA;
                if (data!=null){
                if (data.getData()!=null){
                picturePath=getPathfromUri(column_Name,data.getData());}

                else {
                    picturePath= pictureUri.getPath();

                }
                }
                else {
                    picturePath= pictureUri.getPath();

                }}

这篇关于onActivityResult 返回 Intent data.getData();仅在棉花糖和棒棒糖中始终为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆