Создание намерения запустить системное приложение “Файлы”

#android

Вопрос:

Я хотел бы запустить приложение «Файлы» из своего приложения. Приложение с этим значком:

Значок файлов

Этот приведенный ниже код работает для Android с 9 по 11. В более старых версиях он использовал резервную опцию. Но в Android 12 он не может создать намерение запуска как для com.google.android.documentsui , так и com.android.documentsui для . Есть ли обходной путь для этого?

 public static void startFilesManager(Context context)
{
    try
    {
        // com.android.documentsui is the Files app on Android 9 and 11.
        // com.google.android.documentsui is the Files app in Android 10.
        // com.google.android.apps.nbu.files is Google file manager, this is used as fallback.

        String[] packages = new String[] {
            "com.android.documentsui",
            "com.google.android.documentsui",
            "com.google.android.apps.nbu.files"
        };

        Intent intent = null;

        for (int i = 0; i < packages.length; i  ) {
            String packageName = packages[i];
            intent = context.getPackageManager().getLaunchIntentForPackage(packageName);

            if(intent != null) {
                break;
            }
        }

        // If nothing is installed, navigate user to the store.
        if (intent == null) {
            intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("market://details?id="   packages[packages.length - 1]));
        }

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
    catch (Exception e)
    {
        Log.e("FileManager", "startFilesManager: failed to start", e);
    }
}
 

Обновление, которое я также пробовал, Intent.CATEGORY_APP_FILES как показано ниже, но оно просто выдает ActivityNotFoundException . Это происходит в любой версии Android (по крайней мере, в эмуляторе, где установлены файлы).

 public static void startFilesManager(Context context)
{
    try
    {
        Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_FILES);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
    catch (Exception e)
    {
        Log.e("FileManager", "startFilesManager: failed to start", e);
    }
}
 

Комментарии:

1. Вместо жесткого кодирования пакетов, возможно, вам следует использовать CATEGORY_APP_FILES вместо этого.

2. Вы уверены, что на устройстве вообще есть это приложение? например, в файловом менеджере Samsungs приложение com.sec.android.app.myfiles

3. Отличное предложение @CommonsWare, но оно не сработало. Вопрос обновлен с помощью примера кода.

4. Да, в любом случае это ново для API 29-го уровня-я пропустил это в своем первоначальном комментарии.