无法从Android 7.1及更高版本的设备

时间:2017-12-28 10:07:00

标签: android

我正在尝试从图库中选择图像,它在Android 7.1下面正常工作但是从android 7.1它不适合我。如何修复相同。 这是我试过的代码:

public void LaunchGalleryView() {
        mFileUri = null;
        Intent intent = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), REQUEST_CODE_GALLERY);
    }

这是onActivityResult()中的代码:

 case REQUEST_CODE_GALLERY:
                if (data == null) {
                    return;
                }
                Uri selectedImage = data.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};
                Cursor cursor = getContentResolver().query(selectedImage,
                        filePathColumn, null, null, null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String picturePath = cursor.getString(columnIndex);
                cursor.close();

                File file = new File(picturePath);
                mFileUri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", file);
                performCrop();
                break;

如何修复同样请帮助我。

这是错误日志:

  

12-28 05:13:30.085 13533-13533 /? E / AndroidRuntime:致命异常:   主要                                                      过程:com.welldoc.platform.android.cyan,PID:13533                                                      java.lang.RuntimeException:传递结果失败   ResultInfo {who = null,request = 1,result = -1,data = Intent {   DAT =含量://com.google.android.apps.photos.contentprovider/0/1/mediakey:/本地%3Aefc38517-5fd9-4b57-AFBF-6329e508fb66 / ORIGINAL / NONE / 1646850308   flg = 0x1 clip = {text / uri-list   U:内容://com.google.android.apps.photos.contentprovider/0/1/mediakey%3A%2Flocal%253Aefc38517-5fd9-4b57-afbf-6329e508fb66/ORIGINAL/NONE/1646850308}   活动   {com.welldoc.platform.android.cyan / com.welldoc.platform.android.ui.profile.ProfileDetailsEditActivity}:   显示java.lang.NullPointerException                                                          在android.app.ActivityThread.deliverResults(ActivityThread.java:4324)                                                          在android.app.ActivityThread.handleSendResult(ActivityThread.java:4367)                                                          在android.app.ActivityThread.-wrap19(未知来源:0)                                                          在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1649)                                                          在android.os.Handler.dispatchMessage(Handler.java:105)                                                          在android.os.Looper.loop(Looper.java:164)                                                          在android.app.ActivityThread.main(ActivityThread.java:6541)                                                          at java.lang.reflect.Method.invoke(Native Method)                                                          在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)                                                          在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)                                                       引起:java.lang.NullPointerException                                                          在java.io.File。(File.java:282)                                                          在com.welldoc.platform.android.ui.profile.ProfileDetailsEditActivity.onActivityResult(ProfileDetailsEditActivity.java:1059)                                                          在android.app.Activity.dispatchActivityResult(Activity.java:7235)                                                          在android.app.ActivityThread.deliverResults(ActivityThread.java:4320)                                                          在android.app.ActivityThread.handleSendResult(ActivityThread.java:4367)                                                          在android.app.ActivityThread.-wrap19(未知来源:0)                                                          在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1649)                                                          在android.os.Handler.dispatchMessage(Handler.java:105)                                                          在android.os.Looper.loop(Looper.java:164)                                                          在android.app.ActivityThread.main(ActivityThread.java:6541)                                                          at java.lang.reflect.Method.invoke(Native Method)                                                          在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)                                                          在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

4 个答案:

答案 0 :(得分:0)

1。 将图片路径与其他手机图片选择的路径进行比较,有时路径格式可能会有所不同,因此您可以获得null。

答案 1 :(得分:0)

method FileProvider.getUriForFile()的第二个参数要求您创建自定义FileProvider并在应用的清单中定义它:

  

authority String:应用程序清单中元素中定义的FileProvider的权限。

如果您只想获取文件Uri,可以使用下一个代码:

Uri.fromFile(file);

答案 2 :(得分:0)

  

我正在尝试从图库中选择图像,它在android 7.1下面正常工作

仅针对您尝试的设备,针对您尝试过的方案。它将在许多其他设备和其他场景中失败:

  • ACTION_PICK无需从Uri
  • 返回MediaStore
  • MediaStore无需为您提供路径
  • MediaStore无需为您提供可以阅读的路径,更不用说写入
  

这是onActivityResult()中的代码:

您已有Uri。您不需要FileProvider。您无需查询MediaStoreselectedImageUri。因此,请将其与您首选的image cropping library一起使用,并让该库将其结果保存到您控制的某个文件中。

如果由于某种原因,您需要一开始就有一个文件:

  • 致电getContentResolver()获取ContentResolver
  • 致电openInputStream()上的ContentResolver,传递selectedImage,获取该内容的InputStream
  • 在您控制的文件上创建FileOutputStream(例如,在getCacheDir()中)
  • 将数据从InputStream复制到FileOutputStream
  • 使用生成的文件

答案 3 :(得分:0)

试试这个

  • 您必须从代码中删除此行,只需添加此startActivityForResult(intent,1);
  • 即可
  • 我认为你传递的是错误的意图,而这种意图往往不会打开galleryDocumentProvider
  • 将此内容放入OnActivityResult

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
         if (requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null) {
            try {
                uri = null;
                uri = data.getData();
                Bitmap bmp = null;
                file_galleryimagepath = null;
                bmp = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
    
                File f = new File(getActivity().getCacheDir(), System.currentTimeMillis() + ".jpg");
                if (f.exists())
                    f.delete();
                f.createNewFile();
                Bitmap bitmap = bmp;
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
                byte[] bitmapdata = bos.toByteArray();
                FileOutputStream fos = new FileOutputStream(f);
                fos.write(bitmapdata);
                fos.flush();
                fos.close();
                file_galleryimagepath = f;
                Bitmap map = BitmapFactory.decodeFile(file_galleryimagepath.toString());
                iv_userImage.setImageBitmap(map);
    
            }catch (Exception e){
                Log.e("204","HFP>>>"+e+"<<catch");
            }
        }
      }
    }
    
  • 当您尝试从file path崩溃中获取DocumentProvider' its result becomes时,您必须传递这样的意图。