android - DocumentsUI 在请求访问目录时显示“匿名”应用程序
问题描述
一位用户报告说,通过 ACTION_OPEN_DOCUMENT_TREE 意图选择文件夹时,我的应用程序无法请求目录访问。由于某种原因,它没有显示我的应用程序,而是“匿名”:
翻译:“允许匿名访问相机中的文件。这将允许匿名访问存储在相机中的当前和未来内容”。
用户在 Mi Note 10 lite 上安装了带有 Android 11 的 MIUI 12。我的小米 Note 10 也一样,没问题。
检查了Android源代码:
case TYPE_OEPN_TREE:
final Uri treeUri = mTarget.getTreeDocumentUri();
final BaseActivity activity = (BaseActivity) getActivity();
final String target = activity.getCurrentTitle();
final String text = getString(R.string.open_tree_dialog_title,
**getCallingAppName**(getActivity()), target);
message = getString(R.string.open_tree_dialog_message,
**getCallingAppName**(getActivity()), target);
builder.setTitle(text);
builder.setMessage(message);
builder.setPositiveButton(
R.string.allow,
(DialogInterface dialog, int id) -> {
pickResult.increaseActionCount();
mActions.finishPicking(treeUri);
});
break;
@NonNull
public static String getCallingAppName(Activity activity) {
final String anonymous = activity.getString(R.string.anonymous_application);
final String packageName = getCallingPackageName(activity);
if (TextUtils.isEmpty(packageName)) {
return anonymous;
}
final PackageManager pm = activity.getPackageManager();
ApplicationInfo ai;
try {
ai = pm.getApplicationInfo(packageName, 0);
} catch (final PackageManager.NameNotFoundException e) {
return anonymous;
}
CharSequence result = pm.getApplicationLabel(ai);
return TextUtils.isEmpty(result) ? anonymous : result.toString();
}
public static String getCallingPackageName(Activity activity) {
String callingPackage = activity.getCallingPackage();
// System apps can set the calling package name using an extra.
try {
ApplicationInfo info =
activity.getPackageManager().getApplicationInfo(callingPackage, 0);
if (isSystemApp(info) || isUpdatedSystemApp(info)) {
final String extra = activity.getIntent().getStringExtra(
Intent.EXTRA_PACKAGE_NAME);
if (extra != null && !TextUtils.isEmpty(extra)) {
callingPackage = extra;
}
}
} catch (NameNotFoundException e) {
// Couldn't lookup calling package info. This isn't really
// gonna happen, given that we're getting the name of the
// calling package from trusty old Activity.getCallingPackage.
// For that reason, we ignore this exception.
}
return callingPackage;
}
...而且似乎无论出于何种原因,我的包名都没有找到。怎么可能发生?让他安装我的其他应用程序之一,它也发生在那里。然后要求他从 Playstore(FX 文件资源管理器)安装另一个应用程序,但没有发生。所以它特定于他的设备和我的应用程序。
解决方案
所以事实证明,这个有这个问题的用户在开发者设置中关闭了 MIUI 优化。