尝试获取uri路径

时间:2017-06-27 16:01:10

标签: java android uri android-image filenotfoundexception

我刚刚回到这一段特殊代码,因为它似乎在我们的某个设备上保持返回null。代码行是这样的:

public 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);
        Uri finalUri = null;
        if (path != null) {
            finalUri = Uri.parse(path);
        }
        return finalUri;
    }

错误日志显示:

Failed to insert image
     

java.io.FileNotFoundException:没有这样的文件或目录   android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)   在   android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:620)   在   android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:988)   在   android.content.ContentResolver.openOutputStream(ContentResolver.java:735)   在   android.content.ContentResolver.openOutputStream(ContentResolver.java:711)   在   android.provider.MediaStore $图片$ Media.insertImage(MediaStore.java:958)   在com.scanlibrary.Utils.getUri(Utils.java:31)at   com.scanlibrary.PickImageFragment.postImagePick(PickImageFragment.java:172)   在   com.scanlibrary.PickImageFragment.onActivityResult(PickImageFragment.java:167)   在android.app.Activity.dispatchActivityResult(Activity.java:6871)处   android.app.ActivityThread.deliverResults(ActivityThread.java:4751)at at   android.app.ActivityThread.handleSendResult(ActivityThread.java:4798)   在android.app.ActivityThread.access $ 1500(ActivityThread.java:219)at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1784)   在android.os.Handler.dispatchMessage(Handler.java:102)at   android.os.Looper.loop(Looper.java:145)at   android.app.ActivityThread.main(ActivityThread.java:6939)at   java.lang.reflect.Method.invoke(Native Method)at   java.lang.reflect.Method.invoke(Method.java:372)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

在完成调试器之后,错误似乎来自第31行,其中包含:

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

我的问题是,它似乎在某些设备上运行得很好,而在其他设备上它继续给我这些问题。我似乎无法弄清楚如何修复这个特定的bug。我已尝试浏览使用Utils.getUri()部分的任何部分的源代码,但我还没有理解它是如何工作的以及为什么它给我一个问题,特别是因为它适用于我们的其他设备。

1 个答案:

答案 0 :(得分:1)

我遇到类似的问题,使用API​​ 16或17而不是API 23.

在我的应用程序中,用户按Home,然后他尝试在文件浏览器中打开指定的文件类型或附加在电子邮件中,然后在收到Intent时发生异常。

相反,如果活动被销毁,例如按回键,然后我们打开相关文件,那么它运作良好。

我找到的唯一解决方案是在异常catch中要求用户关闭应用程序并再试一次,如果他回答OK,那么我调用了finish()。

当现有的Activity接收到第二个Intent时,似乎会出现问题,但是当该intent是创建Activity的那个intent时效果正常,但正如我在API 23或24开头所说的那样运行良好。

希望有所帮助。