首页 > 解决方案 > DocumentsUI 在请求访问目录时显示“匿名”应用程序

问题描述

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

在此处输入图像描述

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

用户在 Mi Note 10 lite 上安装了带有 Android 11 的 MIUI 12。我的小米 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 文件资源管理器)安装另一个应用程序,但没有发生。所以它特定于他的设备和我的应用程序。

标签: androidstorage-access-framework

解决方案


所以事实证明,这个有这个问题的用户在开发者设置中关闭了 MIUI 优化。在此处输入图像描述在此处输入图像描述


推荐阅读