Не удалось получить имя пакета APK из папки загрузки в Android 11

#android #file #android-11 #package-name

Вопрос:

У меня есть application файл, который загружается APK's в папку загрузки. Как только я начал поддерживать SDK 30 и попробовал приложение на Android 10 и 11, я получил сообщение об ошибке.

 downloadRequest = new DownloadManager.Request(uri)
                .setTitle(downloadKey)
                .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, downloadKey)
                .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
 

Когда загрузка завершена, у меня есть файл, и мне нужно получить из него имя пакета.

 File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath(), downloadApp.getDownloadKey());
getPackageNameForAPK(file.getPath(), context);


private static String getPackageNameForAPK(final String archiveFilePath, Context context) {
    PackageInfo info = context.getPackageManager().getPackageArchiveInfo(archiveFilePath, 0);
    return info.packageName;
}
 

И он вылетает в строке return info.packageName; с ошибкой:

 Caused by: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.content.pm.PackageInfo.packageName' on a null object reference
 

Я добавил в манифест все разрешения, которые только мог придумать, и как вручную, так и программно включил все разрешения для приложения:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
    tools:ignore="QueryAllPackagesPermission" />
 

Я не думаю, что проблема в разрешениях, так как я могу получить размер файла и создать новый файл из пути к файлу и т.д.

Я предположил, что это как-то связано с новыми требованиями Android 11 к хранилищу, но поскольку он сохранен в папке «Загрузки», и у меня есть доступ к файлу, я не думаю, что это должно помешать мне также получить имя пакета.

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

1. I do not think the issue is with permissions since I can get the file size and create a new File from filepath etc. Может ли ваше приложение удалить файл?

2. android:name="android.permission.MANAGE_EXTERNAL_STORAGE Вы просили об этом в декларации. Но это не будет иметь никакого эффекта, прежде чем вы добавите код и дадите пользователю подтверждение. Вы не упомянули об этом «доступе ко всем файлам». Ну, я думаю, тебе это не нужно.

3. Если вы думаете, что это как-то связано с владельцем, то позвольте вашему приложению сначала скопировать этот файл apk. Затем попробуйте получить имя пакета из копии.

4. Хорошо, как я и писал.. Я вручную включил разрешения, указанные в разрешении на хранение, а также разрешение на установку неизвестных приложений. Я также включил их для программной проверки и запроса разрешений, если это необходимо. Что касается создания копии.. Я попробовал это сделать, но все равно получил ту же ошибку

5. Вы упомянули папку загрузки. Почему? Теперь похоже, что это как-то связано с той папкой, в чем я сомневаюсь. Попробуйте другую папку.