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

问题描述:

可能重复但未找到任何解决方案。MediaStore.Images.Media.insertImage在某些设备中返回null

我想修改图像并使用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 - :

。三星J7(2016)

。 LG Magna LTE

。 Android模拟器API 21

我很惊讶这个应用程序工作在Android模拟器API 26。但得到崩溃Android模拟器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) 

感谢

+0

在'Bitmap'上使用'compress()'将图像写入到您所选文件的'FileOutputStream'中。使用“MediaScannerConnection”索引。作为奖励功能,您现在可以知道图像的存储位置,并可以选择用户可能会欣赏的地方。您当前的代码将图像存储在您或用户选择的位置。 – CommonsWare

+0

我同意@CommonsWare一个很好的解决方案来保存文件,或者我也使用'FileOutputStream'将pdf文件保存到我的应用程序中的特定位置。但我想知道为什么会发生这种情况。 – UltimateDevil

+0

显然,图像未能被存储。在“MediaStore”标签中检查LogCat中的消息(例如,“无法插入图像”,“无法创建缩略图,删除原始文件”)。 – CommonsWare

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

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。

+0

感谢您的答案@Jithesh这适用于保存图像数据库的罚款,但是当我从'相同'uri' gettingBitmap'然后我得到'java.io.FileNotFoundException:没有这样的文件或目录。 – UltimateDevil

+0

无论上面的代码,我补充说,适用于拍摄从相机拍摄的图像。 –

+0

好的谢谢你的回答 – UltimateDevil

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方法,我希望它能工作。