ACTION_PICK 与 MediaStore.Images.Media.INTERNAL_CONTENT_URI 允许用户选择通过 picasa 同步的图像(不在设备上?)

2023-12-27

我正在运行 ICS 并使用相同 Google 帐户的平板电脑和手机上测试我们的应用程序。如果我在一台设备上拍照,它将显示在另一台设备上(通过 Picasa 同步)。奇怪的是,当我执行正常操作时,照片会显示在两个设备上

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);

让用户从图库中选择图像。我的 onActivityResult() 看起来像这样:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != Activity.RESULT_OK) {
        return; // user cancelled
    }

    Uri imageUri = data.getData();
    if (imageUri == null) {
        // (code to show error message goes here)
        return;
    }

    // Get image path from media store
    String[] filePathColumn = { android.provider.MediaStore.MediaColumns.DATA };
    Cursor cursor = this.getContentResolver().query(imageUri, filePathColumn, null, null, null);

    if(cursor == null || !cursor.moveToFirst()) {
        // (code to show error message goes here)
        return;
    }

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String imagePath = cursor.getString(columnIndex);
    cursor.close();

    if (imagePath == null) {
        // error happens here
    }
}

一切都很好,直到最后 imagePath 为空。该代码适用于设备上的其他照片,但不适用于同步的照片。添加一些日志代码后,我们的一些生产用户似乎会遇到这种情况,尽管这种情况非常罕见(不到万分之一)。

据我了解,ACTION_GET_CONTENT 具有 EXTRA_LOCAL_ONLY 标志,仅显示本地文件,但这仅适用于 API 版本 11 及更高版本。 ACTION_GET_CONTENT还有CATEGORY_OPENABLE,仅显示可以打开的数据。我的 ACTION_PICK 意图是否以某种方式(错误地?)显示实际上不是本地或不可打开的照片?根据文档,使用 INTERNAL_CONTENT_URI 只能显示内部存储的照片。

或者我的 onActivityResult() 代码有任何问题吗?我见过很多不同的变体:

  • 检查以确保 data.getData().getPath() 不为 null
  • 使用 MediaStore.Images.Media.DATA 作为投影而不是 MediaStore.MediaColumns.DATA
  • 使用 MediaStore.Images.ImageColumns.DATA 作为投影而不是 MediaStore.MediaColumns.DATA
  • 使用 ManagedQuery() 来获取 Cursor 而不是 getContentResolver().query()
  • 使用 CursorLoader 获取 Cursor (API 11+)
  • 使用 getColumnIndexOrThrow() 而不是 getColumnIndex()
  • 调用cursor.getColumnIndex(MediaStore.Images.Media.DATA)然后调用cursor.moveToFirst()
  • 使用“userImage”作为列名称(getColumnIndex() 的参数)

这些更改是否可以解决问题?


I had 这里描述了类似的问题 https://stackoverflow.com/questions/15284592/unable-to-select-particular-images-using-action-pick-intent.

我通过使用 ContentResolver 直接从 Intent URI 打开 InputStream 来修复此问题:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(requestCode == ACTIVITYRESULT_CHOOSEPICTURE) {
    final InputStream ist = context.getContentResolver().openInputStream(intent.getData());
    final Bitmap bitmap = BitmapFactory.decodeStream(ist);
    ist.close();
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ACTION_PICK 与 MediaStore.Images.Media.INTERNAL_CONTENT_URI 允许用户选择通过 picasa 同步的图像(不在设备上?) 的相关文章

  • 如何从子活动中完成父活动

    我是 Android 开发新手 我创建了一个主 Activity gt A 它有 4 个按钮 4 个按钮之一是 EXIT 按钮 单击退出按钮后 我开始另一个活动 gt B 这将通过 A 活动的意图打开 B 活动 活动 B 包含 您想退出吗
  • 检测蓝牙“通话”按钮按下情况

    我有一个蓝牙耳机 可以与我的手机通信 它有一个大的 通话 按钮 可以接听 结束通话 我正在尝试制作一个应用程序 该应用程序能够在按下通话按钮时进行拦截 我尝试过使用意图过滤器
  • Android 博客应用程序,我应该使用 Sharedpreferences 还是 Intents?

    我正在构建一个android应用程序 当前用户的后续页面是可点击的 我保存点击的页面id并将其传递给打开相应的页面 打开后 用户可以查看关注者列表 页面内的帖子等 这是包含所有页面子级的根节点 数据库 Firebase 结构 pageDat
  • 如何获取当前显示的片段?

    我正在Android中玩fragment 我知道我可以使用以下代码更改片段 FragmentManager fragMgr getSupportFragmentManager FragmentTransaction fragTrans fr
  • Android 分享 Facebook 意图 - 分享文本和链接

    我正在尝试使用 Android 共享意图在 Facebook 上发布内容 它看起来像这样 shareIntent setFlags Intent FLAG ACTIVITY NEW TASK shareIntent setType text
  • Android 从另一个未上传文件的应用程序启动 Google Drive 应用程序

    我尝试通过手动启动 Google 驱动器 安装在设备上 从 Android 应用程序上传文件 我尝试使用此发送Intent createChooser其上传文件附件工作正常 但我需要出于特定目的上传文件 例如 Dropbox 仅限 Goog
  • 多个Android IntentService可以同时运行吗?

    据我了解 一个IntentService一次只能处理一个 Intent 因为它共享一个工作线程来完成所有工作 但如果我有多个IntentService在我的应用程序中 它们可以并行运行 还是都共享单个工作线程 但是如果我的应用程序中有多个
  • Android 应用程序开发 - 不带 Intent 直接发送电子邮件

    任何人都可以建议我如何在不使用意图或打开另一个 Android 应用程序的情况下发送电子邮件 我希望点击发送按钮后直接发送电子邮件 我必须使用特定的 Office365 电子邮件来发送消息 我应该使用一些 API 或 SMTP 等吗 有没有
  • Android 启动完成后自动启动应用程序

    我想制作一个在其设置中具有自动启动选项的应用程序 我在我的应用程序中进行了从 PreferenceActivity 派生的设置活动 并为自动启动选项提供了 CheckBoxPreference 如果启用自动启动选项 我的应用程序应该在手机启
  • android tabwidget意图选项卡刷新每次点击

    我想使用具有意图的子选项卡创建一个选项卡 以便当用户单击选项卡意图时刷新 每次用户单击选项卡时 我想刷新并调用子意图选项卡的 oncreate 方法 public class Tabs3 extends TabActivity Overri
  • Parcelable 写入可序列化对象 getactivity() 时遇到 IOException

    所以我在 logcat 中得到了这个 java lang RuntimeException Parcelable encountered IOException writing serializable object name com re
  • 分享失败,请重试(仅限whatsapp)

    当我将内容分享到 Whatsapp 时 它返回到分享页面 并显示 Toast 通知 分享失败 请重试 my code if url startsWith share Uri requestUrl Uri parse url String p
  • 在另一个 Intent 中发送 Intent

    也许我的处理方式是错误的 但我想在我自己的应用程序中响应我的 Android AppWidget 的点击事件并启动一个 Activity 当时我设置了PendingIntent我还有一个Intent我想在点击时启动它 我的onStartCo
  • Android 上的 Facebook 深度链接

    我正在尝试在我的应用程序上实现 Facebook 的深度链接功能 并遇到了以下情况 我有一个名为 MainActivity 的活动 其声明如下
  • 从通知中打开文件

    我从服务器下载一个文件 对于此操作 我显示了进度不确定的通知 下载文件后 我想通过单击通知来打开它 我获得了扩展名并尝试使用以下命令打开它intent像这样 public static Intent openFile Context con
  • Cordova + android:无法从应用程序打开拨号盘或邮件意图

    我有一个奇怪的问题 我无法从应用程序中打开带有预定义号码或邮件意图的拨号盘 我正在使用 netbeans 8 0 1 创建 cordova 应用程序 我的 Cordova 版本是 4 0 0 我按照步骤创建了一个应用程序 并选择了 Hell
  • 在 Android 中选择视频的最佳方式是什么

    我得到了一个完美的意图 ACTION PICK和我的照片 启动活动结果 新 意图 Intent ACTION PICK android provider MediaStore Images Media INTERNAL CONTENT UR
  • 在 android 中使用 MediaStore.ACTION_IMAGE_CAPTURE 意图捕获图像

    我正在使用 MediaStore ACTION IMAGE CAPTURE 意图捕获图像 它在大多数设备上运行良好 但它无法按预期在某些最新的 Android 设备中正常工作 我的目的是使用相机捕获图像并将其发送到服务器 但不将该图像存储在
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器

随机推荐