我有一个简单的代码,可以通过在以前的 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;
}
在这里你可以看到行为的变化取决于手机..
提前致谢
最佳答案
当您的应用程序的 targetSdkVersion
是 30
或稍后,您将收到经过过滤的 Activity/套餐列表。因此,不同手机/设置上的奇怪结果。还值得注意的是这也会影响 ShareActionProvider这通常用于共享操作。
Android 11 中的包可见性
阅读 Android Documentation 中的详细信息.在那里你可以找到解决这个问题的方法。 list 必须包含 <queries>
标签。
解决方案
运行最新版本的Android Studio
和 Gradle
.然后修改你的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/