【问题标题】:MediaStore.Images.Media.insertImage is returning null when trying to save the imageMediaStore.Images.Media.insertImage 在尝试保存图像时返回 null
【发布时间】:2014-04-14 12:01:07
【问题描述】:

我正在使用自定义视图,并且我正在使用用户可以在其中绘制任何内容的画布,之后我想将该图像保存在 sd 卡中 bt 无法做到这一点。不知道发生了什么事。

else if(view.getId()==R.id.save_btn){
            //save drawing
            AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
            saveDialog.setTitle("Save drawing");
            saveDialog.setMessage("Save drawing to device Gallery?");
            saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
                private FileOutputStream fOut;

                public void onClick(DialogInterface dialog, int which){
                    //save drawing
                    drawView.setDrawingCacheEnabled(true);

                    //attempt to save
                    String imgSaved = MediaStore.Images.Media.insertImage(
                            getContentResolver(), drawView.getDrawingCache(),
                            UUID.randomUUID().toString()+".png", "drawing");
                    //feedback
                    if(imgSaved!=null){
                        Toast savedToast = Toast.makeText(getApplicationContext(), 
                                "Drawing saved to Gallery!", Toast.LENGTH_SHORT);
                        savedToast.show();
                    }
                    else{
                        Toast unsavedToast = Toast.makeText(getApplicationContext(), 
                                "Oops! Image could not be saved.", Toast.LENGTH_SHORT);
                        unsavedToast.show();
                    }
                    drawView.destroyDrawingCache();
                }
            });
            saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int which){
                    dialog.cancel();
                }
            });
            saveDialog.show();
        }

这里是错误详情

04-14 11:24:28.700: E/MediaStore(6866): Failed to insert image
04-14 11:24:28.700: E/MediaStore(6866): java.io.FileNotFoundException: No such file or directory
04-14 11:24:28.700: E/MediaStore(6866):     at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
04-14 11:24:28.700: E/MediaStore(6866):     at android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:577)
04-14 11:24:28.700: E/MediaStore(6866):     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:673)
04-14 11:24:28.700: E/MediaStore(6866):     at android.content.ContentResolver.openOutputStream(ContentResolver.java:537)
04-14 11:24:28.700: E/MediaStore(6866):     at android.content.ContentResolver.openOutputStream(ContentResolver.java:513)
04-14 11:24:28.700: E/MediaStore(6866):     at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:891)
04-14 11:24:28.700: E/MediaStore(6866):     at com.example.clent.MainActivity$9.onClick(MainActivity.java:238)
04-14 11:24:28.700: E/MediaStore(6866):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
04-14 11:24:28.700: E/MediaStore(6866):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-14 11:24:28.700: E/MediaStore(6866):     at android.os.Looper.loop(Looper.java:137)
04-14 11:24:28.700: E/MediaStore(6866):     at android.app.ActivityThread.main(ActivityThread.java:5103)
04-14 11:24:28.700: E/MediaStore(6866):     at java.lang.reflect.Method.invokeNative(Native Method)
04-14 11:24:28.700: E/MediaStore(6866):     at java.lang.reflect.Method.invoke(Method.java:525)
04-14 11:24:28.700: E/MediaStore(6866):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
04-14 11:24:28.700: E/MediaStore(6866):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-14 11:24:28.700: E/MediaStore(6866):     at dalvik.system.NativeStart.main(Native Method)

我在尝试保存图像时总是收到此消息......“糟糕!图像无法保存。”.....

【问题讨论】:

  • 在 Android 4.4.2 SM-P601 上遇到同样的问题。插入图像方法总是失败。有同样的例外。
  • 你能保存为PNG吗?因为似乎带有Bitmap参数的insertImage总是保存为image/jpegsource

标签: android canvas android-sdcard mediastore


【解决方案1】:

我在模拟器 (Android 4.4) 中遇到了这个问题,结果是由于Android bug,当用户之前没有在设备上拍照时会发生这种情况(即画廊是空的并且没有已初始化。)。解决方法是手动初始化照片目录:

void fixMediaDir() {
    File sdcard = Environment.getExternalStorageDirectory();
    if (sdcard != null) {
        File mediaDir = new File(sdcard, "DCIM/Camera");
        if (!mediaDir.exists()) {
            mediaDir.mkdirs();
        }
    }
}

不确定这是否在更高版本的 Android 中得到修复。

【讨论】:

  • 是的。喜欢这个评论。没错。
  • 对我来说,这是在“图片”(Environment.DIRECTORY_PICTURES) 目录丢失时发生的。创建该目录修复了它。
【解决方案2】:

回答有点晚了,但还是……

不确定是第 238 行,但可能原因在这里:

字符串 imgSaved = MediaStore.Images.Media.insertImage( getContentResolver()、drawView.getDrawingCache()、 UUID.randomUUID().toString()+".png", "绘图");

由于该方法位于单击侦听器中,getContentResolver 可能会返回一个与应用程序不同的解析器。保存对内容解析器的私有引用,或者您可以尝试将 getContentResolver 替换为 MainActivity.this.getContentResolver()

字符串 imgSaved = MediaStore.Images.Media.insertImage( MainActivity.this.getContentResolver(), drawView.getDrawingCache(), UUID.randomUUID().toString() + ".png", “绘图”);

或者,这可能是一个权限问题。确保清单中有:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

最后一点,insertImage 的结果是一个 URI,imgSaved 不是该变量的最佳名称:)

【讨论】:

  • 谢谢,您的评论帮助了我。我在我的适配器中创建了一个私有 ContentResolver contentResolver 作为字段,在初始化时我附加了 getContext().getContentResolver();到它,在做 insertImage 时,我使用了 contentResolver。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多