Установка apk, обновляющего одно и то же приложение, на Android 10 не удалась; java.lang.SecurityException: файлы все ещJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Установка apk, обновляющего одно и то же приложение, на Android 10 не удалась; java.lang.SecurityException: файлы все ещ

Сообщение Anonymous »

Наше приложение загружает APK с нашего сервера и запускает его для обновления. Как упоминалось в Android 10 — не обнаружено действий для обработки намерения и Xamarin Android 10 Install APK — не обнаружено действий для обработки намерения, это не работает так, как раньше, если мобильное устройство было обновлено до Android 10, и появляется сообщение «Нет активности для обработки». Намерение".

Мы попытались переписать это с помощью PackageInstaller, как показано в примере
https://android.googlesource.com/platfo ... /+/master/ sample/ApiDemos/src/com/example/android/apis/content/InstallApkSessionApi.java, но теперь вместо этого появляется эта ошибка:

Код: Выделить всё

signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: 'JNI DETECTED ERROR IN APPLICATION: JNI GetStaticMethodID called with pending exception java.lang.SecurityException: Files still open
at java.lang.Exception android.os.Parcel.createException(int, java.lang.String) (Parcel.java:2071)
at void android.os.Parcel.readException(int, java.lang.String) (Parcel.java:2039)
at void android.os.Parcel.readException() (Parcel.java:1987)
at void android.content.pm.IPackageInstallerSession$Stub$Proxy.commit(android.content.IntentSender, boolean) (IPackageInstallerSession.java:593)
at void android.content.pm.PackageInstaller$Session.commit(android.content.IntentSender) (PackageInstaller.java:1072)
at void com.mycompany.myApp.QtJavaCustomBridge.JIntentActionInstallApk(java.lang.String) (QtJavaCustomBridge.java:301)
at void org.qtproject.qt5.android.QtNative.startQtApplication() (QtNative.java:-2)
at void org.qtproject.qt5.android.QtNative$7.run() (QtNative.java:374)
at void org.qtproject.qt5.android.QtThread$1.run() (QtThread.java:61)
at void java.lang.Thread.run() (Thread.java:919)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.pm.PackageInstallerSession.assertNoWriteFileTransfersOpenLocked(PackageInstallerSession.java:837)
at com.android.server.pm.PackageInstallerSession.sealAndValidateLocked(PackageInstallerSession.java:1094)
at com.android.server.pm.PackageInstallerSession.markAsCommitted(PackageInstallerSession.java:987)
at com.android.server.pm.PackageInstallerSession.commit(PackageInstallerSession.java:849)
at android.content.pm.IPackageInstallerSession$Stub.onTransact(IPackageInstallerSession.java:306)
(Throwable with no stack trace)

Вот код, который мы используем:

Код: Выделить всё

public static final String TAG = "JAVA";
public static final String PACKAGE_INSTALLED_ACTION = "com.mycompany.myApp.SESSION_API_PACKAGE_INSTALLED";

public static void JIntentActionInstallApk(final String filename)
{
PackageInstaller.Session session = null;
try {
Log.i(TAG, "JIntentActionInstallApk " + filename);
PackageInstaller packageInstaller = MyAppActivity.getActivityInstance().getPackageManager().getPackageInstaller();
Log.i(TAG, "JIntentActionInstallApk - got packageInstaller");
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
Log.i(TAG, "JIntentActionInstallApk - set SessionParams");
int sessionId = packageInstaller.createSession(params);
session = packageInstaller.openSession(sessionId);
Log.i(TAG, "JIntentActionInstallApk - session opened");

// Create an install status receiver.
Context context = MyAppActivity.getActivityInstance().getApplicationContext();
addApkToInstallSession(context, filename, session);
Log.i(TAG, "JIntentActionInstallApk - apk added to session");

Intent intent = new Intent(context, MyAppActivity.class);
intent.setAction(MyAppActivity.PACKAGE_INSTALLED_ACTION);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.getIntentSender();
// Commit the session (this will start the installation workflow).
session.commit(statusReceiver);
Log.i(TAG, "JIntentActionInstallApk - commited");
} catch (IOException e) {
throw new RuntimeException("Couldn't install package", e);
} catch (RuntimeException e) {
if (session != null) {
session.abandon();
}
throw e;
}
}

private static void addApkToInstallSession(Context context, String filename, PackageInstaller.Session session)
{
Log.i(TAG, "addApkToInstallSession " + filename);
// It's recommended to pass the file size to openWrite().  Otherwise installation may fail
// if the disk is almost full.
try {
OutputStream packageInSession = session.openWrite("package", 0, -1);
InputStream input;
Uri uri = Uri.parse(filename);
input = context.getContentResolver().openInputStream(uri);

if(input != null) {
Log.i(TAG, "input.available: " + input.available());
byte[] buffer = new byte[16384];
int n;
while ((n = input.read(buffer)) >= 0) {
packageInSession.write(buffer, 0, n);
}
}
else {
Log.i(TAG, "addApkToInstallSession failed");
throw new IOException ("addApkToInstallSession");
}

}
catch (Exception e) {
Log.i(TAG, "addApkToInstallSession failed2 " + e.toString());
}
}

...

@Override
protected void onNewIntent(Intent intent) {
Bundle extras = intent.getExtras();
if (PACKAGE_INSTALLED_ACTION.equals(intent.getAction())) {
int status = extras.getInt(PackageInstaller.EXTRA_STATUS);
String message = extras.getString(PackageInstaller.EXTRA_STATUS_MESSAGE);
switch (status) {
case PackageInstaller.STATUS_PENDING_USER_ACTION:
// This test app isn't privileged, so the user has to confirm the install.
Intent confirmIntent = (Intent) extras.get(Intent.EXTRA_INTENT);
startActivity(confirmIntent);
break;
case PackageInstaller.STATUS_SUCCESS:
Toast.makeText(this, "Install succeeded!", Toast.LENGTH_SHORT).show();
break;
case PackageInstaller.STATUS_FAILURE:
case PackageInstaller.STATUS_FAILURE_ABORTED:
case PackageInstaller.STATUS_FAILURE_BLOCKED:
case PackageInstaller.STATUS_FAILURE_CONFLICT:
case PackageInstaller.STATUS_FAILURE_INCOMPATIBLE:
case PackageInstaller.STATUS_FAILURE_INVALID:
case PackageInstaller.STATUS_FAILURE_STORAGE:
Toast.makeText(this, "Install failed! " + status + ", " + message,
Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "Unrecognized status received from installer: " + status,
Toast.LENGTH_SHORT).show();
}
}
}
Целевой SDK настроен на API 23, чтобы иметь возможность поддерживать старые устройства, которые есть у некоторых клиентов. Мы используем Qt в качестве платформы приложения, но Java для таких встроенных функций Android, как эта.

Некоторые мысли по этому поводу:

* В Xamarin Android 10 Install APK — не обнаружено действий для обработки намерения, они упоминают, что им нужно выполнить дополнительную сборку мусора в Xamarin. Может быть, это из-за той же проблемы, что и здесь? Если да, то как мы можем передать это напрямую в Java?

* Мы пытаемся обновить то же приложение, используя загруженный APK. Будет ли это вообще работать с помощью установщика пакетов? Если нет, нужно ли нам использовать второе приложение для обновления исходного?

* У нас также есть служба уведомлений, работающая в приложении, может ли это быть причиной " Файлы все еще открыты"?

Подробнее здесь: https://stackoverflow.com/questions/583 ... g-security
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»