Android onActivityResult返回意图数据。getData();总是空的只有棉花糖和棒棒糖

Android onActivityResult返回意图数据。getData();总是空的只有棉花糖和棒棒糖,android,camera,android-camera-intent,onactivityresult,Android,Camera,Android Camera Intent,Onactivityresult,阅读我的全部代码。除了棉花糖和棒棒糖,它在所有手机上都能正常工作。在棉花糖和棒棒糖手机中,唯一的问题是数据。getData仅在捕获图片时返回null。如果我拍摄视频,效果很好。我有4个案例- 从库中选择图片并在Imageview中显示其缩略图-工作正常 从相机捕获图片并在Imageview中显示其缩略图-在棉花糖和棒棒糖中不起作用 从Gallery中选择视频并在Imageview中显示其缩略图-工作正常 3.从摄像头捕获视频并在Imageview中显示其缩略图-工作正常 现在有很多解决方案,但它

阅读我的全部代码。除了棉花糖和棒棒糖,它在所有手机上都能正常工作。在棉花糖和棒棒糖手机中,唯一的问题是数据。getData仅在捕获图片时返回null。如果我拍摄视频,效果很好。我有4个案例-

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

从相机捕获图片并在Imageview中显示其缩略图-在棉花糖和棒棒糖中不起作用

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

3.从摄像头捕获视频并在Imageview中显示其缩略图-工作正常

现在有很多解决方案,但它们都不令人满意,如果在视频捕获的情况下代码运行良好,那么为什么它不用于图像捕获?是一个Bug还是我在某个地方做错了

这是我的密码。我已经评论了一行崩溃发生的地方-

 @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();
            }

    }

}
除了棉花糖和棒棒糖,它在所有手机上都能正常工作

不,不是。当用户选择一个写得很好的摄像头应用程序来处理你的动作、图像和捕获请求时,很多Android版本都会失败

你的问题在于:

            if (data.getData()!=null){
            picturePath=getPath(column_Name,data.getData());}
            else {
                //My app Crashes here because in Marshmallow data.getData() is always null.
            }
这里至少有两个缺陷

最重要的一点是假设您从ACTION_IMAGE_CAPTURE获取了一个Uri,相机应用程序不需要返回Uri。特别是,在您的结构中,您只能通过getExtradata返回缩略图。如果你想要一个全尺寸的图像,在你的意图上使用额外的输出,在这种情况下你知道图像被存储在哪里-它在你在额外的输出中指示的任何地方

另一个是,您假设返回的Uri来自MediaStore,或者具有MediaStore.Video.Media.DATA列。摄像头应用程序不仅不必返回Uri,而且不要求Uri来自MediaStore或具有这样的列

除了棉花糖和棒棒糖,它在所有手机上都能正常工作

不,不是。当用户选择一个写得很好的摄像头应用程序来处理你的动作、图像和捕获请求时,很多Android版本都会失败

你的问题在于:

            if (data.getData()!=null){
            picturePath=getPath(column_Name,data.getData());}
            else {
                //My app Crashes here because in Marshmallow data.getData() is always null.
            }
这里至少有两个缺陷

最重要的一点是假设您从ACTION_IMAGE_CAPTURE获取了一个Uri,相机应用程序不需要返回Uri。特别是,在您的结构中,您只能通过getExtradata返回缩略图。如果你想要一个全尺寸的图像,在你的意图上使用额外的输出,在这种情况下你知道图像被存储在哪里-它在你在额外的输出中指示的任何地方


另一个是,您假设返回的Uri来自MediaStore,或者具有MediaStore.Video.Media.DATA列。摄像头应用程序不仅不必返回Uri,而且不要求Uri来自MediaStore或具有此类列。

正如@Commonware所建议的那样-

摄像头应用程序不需要返回uri

而且

你需要告诉相机应用程序在哪里写图像

所以,我用-

 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);
在活动结果中-


正如@commonware所建议的那样-

摄像头应用程序不需要返回uri

而且

你需要告诉相机应用程序在哪里写图像

所以,我用-

 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);
在活动结果中-


当我们在android中从摄像头捕获图像时,Uri或data.getdata为空。我们有两种解决方案来解决这个问题

我们可以从位图图像中获取Uri路径 我们可以从游标获取Uri路径。 我将在这里实现所有方法,请仔细观看和阅读:-

首先,我将介绍如何从位图图像获取Uri: 完整代码为:

首先,我们将通过两种方法相同的意图捕获图像,所以我只在这里编写一次代码:

 // Capture Image
        captureImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (intent.resolveActivity(getPackageManager()) != null) {
                    startActivityForResult(intent, reqcode);
                }

            }
        });
现在,我们将实现OnActivityResult:-这将与上述两种方法相同:-

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


        if(requestCode==reqcode && resultCode==RESULT_OK)
        {

Bitmap photo = (Bitmap) data.getExtras().get("data");
ImageView.setImageBitmap(photo);

            // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
            Uri tempUri = getImageUri(getApplicationContext(), photo);

            \\ Show Uri path based on Image
            Toast.makeText(LiveImage.this,"Here "+ tempUri, Toast.LENGTH_LONG).show();

           \\ Show Uri path based on Cursor Content Resolver
            Toast.makeText(this, "Real path for URI : "+getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
}
        else
        {
            Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
        }
    }
\现在我们将创建上述所有方法,通过类从Image和Cursor方法创建Uri:

现在是位图图像的URI路径

  private Uri getImageUri(Context applicationContext, Bitmap photo) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
        return Uri.parse(path);
    }
\来自已保存图像的真实路径的Uri

  public String getRealPathFromURI(Uri uri) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        return cursor.getString(idx);
    }
亲爱的朋友复制并粘贴此代码,然后尝试理解。 我100%相信,如果你正在制作公司应用程序,这对你来说会更好。
如果你喜欢我的代码,那么请投我一票。…

当我们在android中从摄像头捕获图像时,Uri或data.getdata为空。我们有两种解决方案来解决这个问题

我们可以从位图图像中获取Uri路径 我们可以从游标获取Uri路径。 我将在这里实现所有方法,请仔细观看和阅读:-

首先,我将介绍如何从位图图像获取Uri: 完整代码为:

首先,我们将通过两种方法相同的意图捕获图像,所以我只在这里编写一次代码:

 // Capture Image
        captureImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (intent.resolveActivity(getPackageManager()) != null) {
                    startActivityForResult(intent, reqcode);
                }

            }
        });
现在我们将实施OnActivityResu lt:-上述两种方法的情况相同:-

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


        if(requestCode==reqcode && resultCode==RESULT_OK)
        {

Bitmap photo = (Bitmap) data.getExtras().get("data");
ImageView.setImageBitmap(photo);

            // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
            Uri tempUri = getImageUri(getApplicationContext(), photo);

            \\ Show Uri path based on Image
            Toast.makeText(LiveImage.this,"Here "+ tempUri, Toast.LENGTH_LONG).show();

           \\ Show Uri path based on Cursor Content Resolver
            Toast.makeText(this, "Real path for URI : "+getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
}
        else
        {
            Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
        }
    }
\现在我们将创建上述所有方法,通过类从Image和Cursor方法创建Uri:

现在是位图图像的URI路径

  private Uri getImageUri(Context applicationContext, Bitmap photo) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
        return Uri.parse(path);
    }
\来自已保存图像的真实路径的Uri

  public String getRealPathFromURI(Uri uri) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        return cursor.getString(idx);
    }
亲爱的朋友复制并粘贴此代码,然后尝试理解。 我100%相信,如果你正在制作公司应用程序,这对你来说会更好。
如果你喜欢我的代码,请投我一票。…

现在我已经更新了我不使用的代码。。我发布了错误的Sorry我应该在额外输出的同时传递什么@CommonsWare@KarandeepAtwal:理想情况下,使用ContentProvider支持的Uri。您可以使用file:Uri,但在targetSdkVersion为24+的Android 7.0+上不起作用。请看一个例子,你能再解释一下吗。我只是想得到我拍摄的图像的路径。Rest如果路径已知,我知道如何获取缩略图。@Karandepatwal:我只想获取我捕获的图像的路径-然后你必须通过额外的输出提供一个你希望相机应用程序使用的Uri。但是,请记住,因为摄像头应用程序开发人员似乎没有对其进行太多测试。请看,现在我已经更新了我不使用的代码。。我发布了错误的Sorry我应该在额外输出的同时传递什么@CommonsWare@KarandeepAtwal:理想情况下,使用ContentProvider支持的Uri。您可以使用file:Uri,但在targetSdkVersion为24+的Android 7.0+上不起作用。请看一个例子,你能再解释一下吗。我只是想得到我拍摄的图像的路径。Rest如果路径已知,我知道如何获取缩略图。@Karandepatwal:我只想获取我捕获的图像的路径-然后你必须通过额外的输出提供一个你希望相机应用程序使用的Uri。但是,请记住,因为相机应用程序开发人员似乎没有对其进行太多测试。