4

Я пытаюсь установить пакеты на моем устройстве (из приложения-владельца устройства, которое работает на нем), только с помощью API PackageInstaller и PackageManager. Я искал примеры, но не мог найти ничего, что соответствовало бы моей потребности.Android Lollipop - PackageInstaller.Session commit()

Вот пример моего кода, чтобы установить приложение Facebook:

PackageManager pm = getPackageManager(); 
PackageInstaller mPackageInstaller = pm.getPackageInstaller(); 
PackageInstaller.SessionParams mSessionParams = new PackageInstaller.SessionParams(SessionParams.MODE_FULL_INSTALL); 

mSessionParams.setReferrerUri(Uri.parse("file:///mnt/sdcard/Download/Facebook.apk")); 
int mSessionId = mPackageInstaller.createSession(mSessionParams); 

PackageInstaller.Session mPkgSession = PackageInstaller.openSession(mSessionId); 
OutputStream mOStream = mPkgSession.openWrite("com.facebook.katana", 0, -1); 
mPkgSession.fsync(mOStream); 

Я думаю, следующая функция Мне нужно запустить это «совершить (IntentSender statusReceiver)».

Поэтому, пожалуйста, расскажите мне, как использовать commit() и особенно, как объявить правильный IntentSender для установки APK, который хранится в/sdcard.

Спасибо!

ответ

0

Вы не можете без проблем установить стороннее приложение во вновь создаваемом пользователе с PackageInstaller.Session.commit() без конкретных «прав». Вам либо необходимо:

Разрешение INSTALL_PACKAGES. Но это разрешение недоступно для стороннего приложения. Таким образом, даже с вашим профильным владельцем приложения у вас не будет этого конкретного разрешения. Запустите процесс как ROOT_UID. Это означает, что вам нужно будет запустить устройство.

+0

Поскольку я lanching этих функций от устройства-владелец приложения, следующее разрешения, кажется, хорошо: <использует-разрешение Android: имя = "ANDROID.PERMISSION .INSTALL_PACKAGES "/> – CyrBt

+1

Могу ли я добиться бесшумной установки, если мое приложение подписано с signed.jar производителя и установлено как системное приложение? – beginner

1

Итак, через несколько дней, чтобы найти способ использования IntentSender, я понял, что он действительно содержится в PendingIntent.

Вот код, который может быть использован:

Intent coucou = new Intent(this, ReceivedCommitActivity.class); 
coucou.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

PendingIntent pCoucou = PendingIntent.getActivity(this, 0, coucou,0); 
IntentSender mIntentSender = pCoucou.getIntentSender(); 

mPkgSession.commit(mIntentSender); 
3

Это возможно с Android 6.0 и выше.

  • Сделайте свое приложение владельцем устройства.

Как только ваше приложение получит разрешение владельца устройства, мы можем установить, удалить и обновить без каких-либо вмешательств пользователя.

public static boolean installPackage(Context context, InputStream in, String packageName) 
     throws IOException { 
    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); 
    OutputStream out = session.openWrite("COSU", 0, -1); 
    byte[] buffer = new byte[65536]; 
    int c; 
    while ((c = in.read(buffer)) != -1) { 
     out.write(buffer, 0, c); 
    } 
    session.fsync(out); 
    in.close(); 
    out.close(); 

    session.commit(createIntentSender(context, sessionId)); 
    return true; 
} 

Uninstall:

String appPackage = "com.your.app.package"; 
Intent intent = new Intent(getActivity(), getActivity().getClass()); 
PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0); 
PackageInstaller mPackageInstaller = getActivity().getPackageManager().getPackageInstaller(); 
mPackageInstaller.uninstall(appPackage, sender.getIntentSender()); 
+0

Могу ли я обновить приложение2 из приложения 1, используя эту функциональность через OTA (Over The Air)? – beginner

+0

Да, сэр. @beginner. На самом деле, есть пример для github, который делает то же самое (testdpc on github). Также есть руководство. Https://codelabs.developers.google.com/codelabs/cosu/#0 – amalBit

+1

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