请求访问目录时,DocumentsUI 显示 "Anonymous" 应用程序

DocumentsUI shows "Anonymous" application when requesting access to directory

一位用户报告说,当通过 ACTION_OPEN_DOCUMENT_TREE 意图选择文件夹时,我的应用无法请求目录访问权限。 由于某种原因,它没有显示我的应用程序,而是“匿名”:

翻译:“允许 Anonymous 访问相机中的文件。这将允许 Anonymous 访问存储在相机中的当前和未来内容”。

用户在 Mi Note 10 lite 上有一个 MIUI 12 和 Android 11。 小米Note 10也是一样,没问题。

检查了 Android 源代码:

https://android.googlesource.com/platform/packages/apps/DocumentsUI/+/refs/heads/master/src/com/android/documentsui/picker/ConfirmFragment.java#82

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 File Explorer) 安装另一个应用程序,但没有安装。 所以它特定于他的设备和我的应用程序。

原来是该用户在开发者设置中关闭了MIUI优化。

错误报告:συσκευη,εκδοση miui,Play 商店安装(alpha 1021)。关闭 MIUI 优化后无法指定 b ios 文件或指定游戏镜像目录。将它们重新打开可以解决问题,并且可以正常扫描目录。同样在允许文件夹访问的弹出窗口中,应用程序在我的系统上显示为“匿名”而不是 AetherSX2。一些开发人员在这里谈论同样的问题。