栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android P实现静默安装的方法示例(官方Demo)

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android P实现静默安装的方法示例(官方Demo)

Android9.0无法通过以下两种方式实现静默安装:

1.runtime执行shell cmd
2.PackageInstall 反射机制

但是Google已经给我们推荐了相关的APIDemos,所以建议大家多看看源码~

在frameworks/base/core/java/android/content/pm/PackageInstaller.java有段关于该类的介绍:

  1. The ApiDemos project contains examples of using this API:
  2. ApiDemos/src/com/example/android/apis/content/InstallApk*.java.

public class PackageInstaller

翻阅源码,InstallApk*.java相关的一共两个demo
InstallApkSessionApi.java //静默安装
InstallApk.java //普通安装,调用系统install intent进行安装

下面是InstallApkSessionApi.java的具体demo

package com.example.android.apis.content;

// Need the following import to get access to the app resources, since this
// class is in a sub-package.
import com.example.android.apis.R;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageInstaller;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;



public class InstallApkSessionApi extends Activity {
  private static final String PACKAGE_INSTALLED_ACTION =
      "com.example.android.apis.content.SESSION_API_PACKAGE_INSTALLED";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.install_apk_session_api);

    // Watch for button clicks.
    Button button = (Button) findViewById(R.id.install);
    button.setonClickListener(new onClickListener() {
      public void onClick(View v) {
 PackageInstaller.Session session = null;
 try {
   PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
   PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
   int sessionId = packageInstaller.createSession(params);
   session = packageInstaller.openSession(sessionId);

   addApkToInstallSession("HelloActivity.apk", session);

   // Create an install status receiver.
   Context context = InstallApkSessionApi.this;
   Intent intent = new Intent(context, InstallApkSessionApi.class);
   intent.setAction(PACKAGE_INSTALLED_ACTION);

   //此处也可以使用getBoradcast或者getService回调通知
   PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
   IntentSender statusReceiver = pendingIntent.getIntentSender();

   // Commit the session (this will start the installation workflow).
   session.commit(statusReceiver);
 } catch (IOException e) {
   throw new RuntimeException("Couldn't install package", e);
 } catch (RuntimeException e) {
   if (session != null) {
     session.abandon();
   }
   throw e;
 }
      }
    });
  }

  private void addApkToInstallSession(String assetName, PackageInstaller.Session session)
      throws IOException {
    // 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 is = getAssets().open(assetName)) {
      byte[] buffer = new byte[16384];
      int n;
      while ((n = is.read(buffer)) >= 0) {
 packageInSession.write(buffer, 0, n);
      }
    }
  }

  // Note: this Activity must run in singleTop launchMode for it to be able to receive the intent
  // in onNewIntent().
  @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(/confirm/iIntent);
   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();
      }
    }
  }
}

另外,权限要求:

需要系统签名
permission



 到此这篇关于Android P实现静默安装的方法示例(官方Demo)的文章就介绍到这了,更多相关Android P 静默安装 内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/154514.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号