android - Android 10 上的共享 Intent (queryIntentActivities) 不会返回所有预期的 Intent

标签 android share

我有一个简单的代码,可以通过在以前的 Android 版本中按预期工作的外部应用程序共享照片。
但是我们收到一些报告说用户无法与他们的应用程序共享照片,因为只有其中一些出现在共享表中。

我们在不同的手机(Android 10)上做了一些测试,结果是只有大约 3 或 4 个应用程序可以共享,这取决于手机。例如,在某些手机中会显示 Gmail,但在其他手机中则不会。在 Gmail 出现的地方,它可以正常工作。

知道为什么吗?

这是 Uri 的外观: content://com.MyPackageName.fileprovider/external_cache/test2014_000000059279.jpg

这是 mime 的样子:image/jpeg

这是代码,我已经简化了一点。

public void shareViaIntent(Context context, Uri uri, String mimeType, CharSequence shareTitle) {
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType(mimeType);
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read file from temp cache path of our app
    shareIntent.putExtra(Intent.EXTRA_TEXT, context.getString(R.string.shared_text));
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

    final ArrayList<Intent> shareIntents = getExternalShareIntents(context, shareIntent);

    Intent chooserIntent = Intent.createChooser(target, shareTitle);
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, shareIntents.toArray(new Parcelable[]{}));
    context.startActivity(chooserIntent);
}

private ArrayList<Intent> getExternalShareIntents(Context context, Intent shareIntent) throws Throwable {
    final List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(shareIntent, 0);

    final ArrayList<Intent> shareIntents = new ArrayList<>();
    for (ResolveInfo resolveInfo : resolveInfos) {
        final String packageName = resolveInfo.activityInfo.packageName;

        if (packageName.equals(buildInfo.getApplicationId())) {
            continue;
        }

        Intent intent = new Intent(shareIntent);
        intent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
        shareIntents.add(intent);
    }

    return shareIntents;
}

在这里你可以看到行为的变化取决于手机..

share examples

提前致谢

最佳答案

当您的应用程序的 targetSdkVersion30或稍后,您将收到经过过滤的 Activity/套餐列表。因此,不同手机/设置上的奇怪结果。还值得注意的是这也会影响 ShareActionProvider这通常用于共享操作。
Android 11 中的包可见性
阅读 Android Documentation 中的详细信息.在那里你可以找到解决这个问题的方法。 list 必须包含 <queries>标签。
解决方案
运行最新版本的Android StudioGradle .然后修改你的AndroidManifest.xml如下所示。我的样本只处理 text/plain , 但你当然可以添加其他 MIME如果您的应用需要,请键入。

<manifest>
  <application>
    <!-- -->
  </application>
  <queries>
    <intent>
      <action android:name="android.intent.action.SEND" />
      <data android:mimeType="text/plain" />
    </intent>
  </queries>
</manifest>
有了这个,Intent Chooser不再显示过滤列表。

关于android - Android 10 上的共享 Intent (queryIntentActivities) 不会返回所有预期的 Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59970725/

相关文章:

c# - 如何使用 C# 在不知道任何机器名称的情况下找到 LAN 上所有共享的名称?

android - 如何分享imageview的图像?

java - android gridview子项启动 Activity onclick

android - Android Studio 上的 FacebookSDK - 使用 Audience Network

java - 区分HttpURLConnection中的读取超时和连接超时

iOS 分享图片和文字到 WhatsApp

windows-8 - 如何在 WinRt 中共享文本时添加新行

android - 日志滚动得太快

android - ListView 在图像上使用 AsynTask 滚动到底部

android - 无法与Android应用共享音频文件