Проблема с обновлением приложения для Android без участия пользователя и прав root - PullRequest
0 голосов
/ 08 июля 2019

Я знаю, что есть много постов с переполнением стека по этому вопросу, но я не смог решить свою проблему с помощью любого из них.
Мое приложение доступно только для ограниченной группы людей (приложение внутри компании), поэтомуя не могу опубликовать его в магазине приложений и хочу, чтобы оно обновлялось автоматически при выпуске новой версии на сервере приложений.
это приложение device admin без прав root.Я нашел этот подход для достижения этой цели, но он не сработал.

У меня есть это разрешение в моем файле AndroidManifest.xml для установки пакетов:

   <uses-permission android:name="android.permission.INSTALL_PACKAGES" />

Это мой код:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void installPackage(Context context, String filePath, String packageName)
        throws IOException
{
    Log.d(TAG, "installPackage: start");
    PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);
    // set params
    int sessionId = packageInstaller.createSession(params);
    PackageInstaller.Session session = packageInstaller.openSession(sessionId);
    //
    InputStream in = new FileInputStream(new File(filePath));
    OutputStream out = session.openWrite(packageName, 0, -1);
    IOUtils.copyStream(in, out);
    //
    session.fsync(out);
    in.close();
    out.close();
    //
    session.commit(PendingIntent.getActivity(context, 112233, new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT).getIntentSender());
    Log.d(TAG, "installPackage: commit");
}

И это onCreate метод моего MainActivity класса:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    ComponentName componentName = new ComponentName(this, AdminReceiver.class);
    DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    if (getIntent() != null && dpm != null)
    {
        Log.d(TAG, "onCreate: is app admin : " + dpm.isAdminActive(componentName));
        Log.d(TAG, "onCreate: status : " + getIntent().getIntExtra("android.content.pm.extra.STATUS", 1000));
        Log.d(TAG, "onCreate: intent : " + getIntent().getParcelableExtra("android.intent.extra.INTENT"));
    }
}

, и это мой logcat результат:

2019-07-08 15:03:24.147 5841-5841/com.test.learncheshmak D/AutoUpdateHelper: downloadUpdate: SUCCESSFUL
2019-07-08 15:03:24.147 5841-5841/com.test.learncheshmak D/AutoUpdateHelper: installPackage: start
2019-07-08 15:03:24.295 5841-5841/com.test.learncheshmak D/AutoUpdateHelper: installPackage: commit
2019-07-08 15:03:24.298 5841-5895/com.test.learncheshmak V/FA: Recording user engagement, ms: 11740
2019-07-08 15:03:24.302 5841-5841/com.test.learncheshmak W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@fe51cb8
2019-07-08 15:03:24.307 5841-5841/com.test.learncheshmak V/FA: onActivityCreated
2019-07-08 15:03:24.308 5841-5895/com.test.learncheshmak V/FA: Connecting to remote service
2019-07-08 15:03:24.308 5841-5841/com.test.learncheshmak D/MainActivity: onCreate: is app admin : true
2019-07-08 15:03:24.309 5841-5841/com.test.learncheshmak D/MainActivity: onCreate: status : -1
2019-07-08 15:03:24.309 5841-5841/com.test.learncheshmak D/MainActivity: onCreate: intent : Intent { act=android.content.pm.action.CONFIRM_PERMISSIONS pkg=com.google.android.packageinstaller (has extras) }

Здесь, как мы видим, статус -1.в соответствии с этим документом, который я получил STATUS_PENDING_USER_ACTION, и он определяет, что нам нужно приглашение пользователя для обновления нашего приложения. Но это приложение является приложением администратора устройства (владельца устройства) и согласно этому документу:

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

  • владелец устройства
  • владелец дочернего профиля

, поэтому, если приложение имеет значение device owner, процесс установки будет выполняться автоматически (без запроса пользователя).тогда почему я получаю STATUS_PENDING_USER_ACTION, в то время как мое приложение - device admin приложение?

...