【问题标题】:android implicit intent edit failed to load imageandroid隐式意图编辑无法加载图像
【发布时间】:2016-06-28 10:44:06
【问题描述】:

这是我在设备上调用图像编辑应用程序的隐含意图:

startActivity(new Intent(Intent.ACTION_EDIT).setDataAndType(myUri,
     getMimeType(myUri)).setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | 
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION));

这就是我获取MimeType 的方式:

public String getMimeType(Uri uri) {
    String mimeType = null;
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        ContentResolver cr = getContentResolver();
        mimeType = cr.getType(uri);
    } else {
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    }
    return mimeType;
}

对于某些应用,加载时会崩溃:

在应用程序Sketch_Camera 上,只有一个不可见的页面会加载并禁用与我的应用程序的交互。

在应用程序AirBrush 上,它会加载应用程序,但会因“加载图像失败”消息而崩溃。

是否与我的最低 sdk 版本有关,因为我的是 16? 我也在 9 的最低 sdk 版本上对此进行了测试,结果没有变化。

还有什么我应该添加到这个意图以使用所有应用程序的吗?

我也尝试过 putExtra,但没有帮助:

.putExtra(Intent.ACTION_EDIT, myUri);

我的设备上有一些图库应用,它们都可以毫无问题地启动 Sketch_CameraAirBrush

这里发生了什么?经过两天与这种现象的斗争,我感到很困惑。

【问题讨论】:

  • myUri 的值是多少?为什么您使用image/* 而不是实际的 MIME 类型(因为它是 your 内容,所以 you 知道 MIME 类型是什么)?
  • myUri 是来自图像文件的 uri >> Uri.fromFile(myFile) 为什么我使用 image/* 而不是实际的 MIME 类型?我从堆栈中拾取代码。现在我已经根据你的指南编辑了这个问题。但我仍然得到相同的结果。
  • "myUri 是来自图像文件的 uri" -- 这个文件在哪里? Intent.FLAG_GRANT_READ_URI_PERMISSIONIntent.FLAG_GRANT_WRITE_URI_PERMISSION 在这种情况下是无用的,因为它们与 file Uri 值无关。
  • "这个文件在哪里?"它是通过查询MediaStore.Images.Media.EXTERNAL_CONTENT_URI从一个媒体存储文件的路径创建的文件

标签: android android-intent edit android-implicit-intent


【解决方案1】:

它是通过查询 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 从一个媒体存储文件的路径创建的文件

不保证其他应用程序有权访问此位置,甚至不保证您的应用程序有权访问此位置。例如,图像可能位于removable storage。此外,the file Uri scheme is being banned for cross-app usage,无论如何。

请改用content Uri。例如,在this sample app 中,我在MediaStore 中查询视频。给定一个名为rowCursor 位于特定视频上,我通过以下方式为其生成Uri

videoUri=
    ContentUris.withAppendedId(
      MediaStore.Video.Media.EXTERNAL_CONTENT_URI, row.getInt(row.getColumnIndex(MediaStore.Video.Media._ID)));

这个Uri 既可以用于我自己的目的(例如,交给毕加索以获得缩略图,交给VideoView 进行播放)和交给第三方应用程序(例如,ACTION_VIEW 进行播放)。

除了将基址 Uri 更改为您查询的那个 (MediaStore.Images.Media.EXTERNAL_CONTENT_URI) 之外,相同的基本代码应该适用于您。

另外,去掉Intent 中的标记。这些仅适用于Intent 指向您自己的ContentProvider 的情况,您的原始代码或您从withAppendedId() 创建的Uri 都不是这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2016-07-19
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多