MediaStore.Images.Media.insertImage在某些设备中返回null

时间:2017-09-26 11:24:55

标签: java android mediastore

可能重复,但没有找到任何解决方案。

我正在尝试使用MediaStore修改图片并将其保存到设备。使用以下代码 - :

public class Utils {

    private Utils() {

    }

    static Uri getUri(Context context, Bitmap bitmap) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "Title", null); //returning null in some devices
        Log.d("TAG", "getUri: "+path);
        return Uri.parse(path);   //this is returning null which cause the app crash
    }

    static Bitmap getBitmap(Context context, Uri uri) throws IOException {
        return MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
    }
}

此代码在大多数设备中运行良好,但问题是MediaStore.Images.Media.insertImage在某些设备中返回null,例如 - :

1 即可。三星J7(2016)

2 即可。 LG Magna LTE

第3 即可。 Android Emulator API 21

我很惊讶这个应用程序正在使用 Android Emulator API 26 。但是在 Android Emulator API 21

上遭遇崩溃

我搜索了谷歌,我也找到了同样的问题here,但没有找到足够的答案。

注意 - 我已使用读/写外部存储的运行时权限

但仍然在提到的设备中崩溃。以下是我的崩溃日志 - :

Fatal Exception: java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:51 flg=0x1 }} to activity {com.example/com.scanlibrary.ScanActivity}: java.lang.NullPointerException: uriString
   at android.app.ActivityThread.deliverResults(ActivityThread.java:3574)
   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)
   at android.app.ActivityThread.access$1300(ActivityThread.java:151)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5254)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by java.lang.NullPointerException: uriString
       at android.net.Uri$StringUri.<init>(Uri.java:470)
       at android.net.Uri$StringUri.<init>(Uri.java:460)
       at android.net.Uri.parse(Uri.java:432)
       at com.scanlibrary.Utils.getUri(Utils.java:24)
       at com.scanlibrary.PickImageFragment.postImagePick(PickImageFragment.java:228)
       at com.scanlibrary.PickImageFragment.onActivityResult(PickImageFragment.java:208)
       at android.app.Activity.dispatchActivityResult(Activity.java:6196)
       at android.app.ActivityThread.deliverResults(ActivityThread.java:3570)
       at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)
       at android.app.ActivityThread.access$1300(ActivityThread.java:151)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5254)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

由于

2 个答案:

答案 0 :(得分:2)

而不是使用下面的代码 - :

String path = MediaStore.Media.insertImage(context.getContentResolver(),bitmap,"Title",null);

使用此代码(如下) - :

ContentValues values=new ContentValues();
values.put(MediaStore.Images.Media.TITLE,"Title");
values.put(MediaStore.Images.Media.DESCRIPTION,"From Camera");
Uri path=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);

如果值无效,则将值传递为null。

答案 1 :(得分:0)

protected void onActivityResult(int requestCode, int resultCode,Intent data) {

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

        try {

            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, filePathColumn, null, null, null);
            if (cursor == null)
                return;
            // find the file in the media area
            cursor.moveToLast();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String filePath = "file:///"+cursor.getString(columnIndex);
            cursor.close();
            actualImage = FileUtil.from(this,Uri.parse(filePath));
            actualImageView.setImageBitmap(BitmapFactory.decodeFile(actualImage.getAbsolutePath()));

        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
        }
    }
}

使用onActvittyResult方法我希望它能运作。