#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. Вы упомянули папку загрузки. Почему? Теперь похоже, что это как-то связано с той папкой, в чем я сомневаюсь. Попробуйте другую папку.