Программная установка APK — возвращаемое значение

#android

#Android

Вопрос:

В моем приложении я вызываю интерфейс javascript из своей деятельности. В webview, связанном с этим интерфейсом, я прошу пользователя загрузить и установить APK. Я использую «startActivityForResult» для запуска процесса установки (после загрузки файла). Вот код:

 Intent promptInstall = new Intent(Intent.ACTION_VIEW);
        promptInstall.setDataAndType(Uri.fromFile(new File(PATH   "app.apk")), "application/vnd.android.package-archive");
        startActivityForResult(promptInstall, ACCEPT_INSTALL);
  

Я использую «onActivityResult» в основном классе activity, чтобы получить возвращаемое значение из вышеупомянутого действия. Вот код:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("requestCode, resultCode from Install APK: ", Integer.toString(requestCode)   ", "   Integer.toString(resultCode));   
}
  

Проблема, с которой я сталкиваюсь, заключается в том, что «resultCode» всегда возвращает 0, независимо от того, решил ли пользователь установить приложение или не устанавливать приложение. Мне действительно нужно знать, установил ли пользователь приложение или нет. Есть идеи относительно того, почему возвращаемое значение всегда равно 0?

Моим последним средством было бы использовать packagemanager для проверки существования приложения в функции onActivityResult, чтобы определить, было установлено приложение или нет, но я хотел бы знать, почему возвращаемое значение всегда равно 0.

Большое спасибо…

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

1. Я также сталкиваюсь с той же проблемой, и это смешно

Ответ №1:

Мы разработали app market и столкнулись с той же проблемой. Нашим решением было использовать менеджер пакетов, как вы предлагаете.

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

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

1. Спасибо за ответ. В конечном итоге я использую PackageManager, чтобы проверить, установил ли пользователь приложение или нет.

Ответ №2:

Вы можете проверить время первой установки/lastUpdateTime и сравнить со временем вашего запроса в PackageInstaller для установки вашего пакета, смотрите пример ниже:

 try {

    PackageInfo installedPackageInfo = getPackageManager()
            .getPackageInfo(installedPackageName, PackageManager.GET_ACTIVITIES);
    long firstInstallTime = installedPackageInfo.firstInstallTime;
    long lastUpdateTime = installedPackageInfo.lastUpdateTime;

    // installationRequestTime is the time which you request for the PackageInstaller to install your package. This time should be got from System.currentTimeMillis()
    return firstInstallTime > installationRequestTime || lastUpdateTime > installationRequestTime;
} catch (PackageManager.NameNotFoundException e) {
    // First time installation and user choose to not install the app
    return false;
}
  

Это решение не очень, но, к сожалению, PackageInstaller не предоставляет нам четкий результирующий код.