注册监听

android:name="InstallResultReceiver"

android:enabled="true"

android:exported="true">

public class InstallResultReceiver extends BroadcastReceiver {

public final String TAG = "carden" + InstallResultReceiver.class.getSimpleName();

public InstallResultReceiver() {

}

@Override

public void onReceive(Context context, Intent intent) {

Log.d(TAG, "收到安装反馈广播了");

if (intent != null) {

final int status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS,

PackageInstaller.STATUS_FAILURE);

Log.d(TAG, "收到安装反馈广播了--"+status);

if (status == PackageInstaller.STATUS_SUCCESS) {

// success

int requestCode=intent.getIntExtra("flag",0);

if (requestCode==1){

Log.d(TAG,"静默安装成功");

}else if (requestCode==2){

Log.d(TAG,"静默卸载成功");

}

Log.d(TAG, "APP Install Success!");

} else {

String msg = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE);

Log.e(TAG, "Install FAILURE status_massage" + msg);

}

}

}

}

2,安装,路径根据自己授权动态填写,我是写死的

private void silentInstallApk(Context context,String apkFilePath, String apkName) {

File apkFile = new File(apkFilePath);

long apkFileLength = apkFile.length();

PackageManager pm = context.getPackageManager();

PackageInstaller packageInstaller = pm.getPackageInstaller();

packageInstaller.registerSessionCallback(new PackageInstaller.SessionCallback() {

@Override

public void onCreated(int sessionId) {

Log.e(TAG, "Install Start sessionId-> " + sessionId);

}

@Override

public void onBadgingChanged(int sessionId) {}

@Override

public void onActiveChanged(int sessionId, boolean active) {}

@Override

public void onProgressChanged(int sessionId, float progress) {}

@Override

public void onFinished(int sessionId, boolean success) {

if (success) {

Log.e(TAG, "Silent Install Success");

} else {

Log.e(TAG, "Silent Install Fail");

}

}

});

int count;

int sessionId;

byte[] buffer = new byte[1024*1024];

InputStream inputStream;

OutputStream outputStream;

PackageInstaller.Session session = null;

PackageInstaller.SessionParams sessionParams;

try {

sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);

sessionId = packageInstaller.createSession(sessionParams);

session = packageInstaller.openSession(sessionId);

Log.e(TAG, "Install Start sessionId-> " + sessionId);

inputStream = new FileInputStream(apkFile);

outputStream = session.openWrite("base.apk", 0, apkFileLength);

while((count = inputStream.read(buffer)) != -1) {

outputStream.write(buffer, 0, count);

float progress = ((float)count / (float)apkFileLength);

session.setStagingProgress(progress);

}

session.fsync(outputStream);

inputStream.close();

outputStream.flush();

outputStream.close();

Intent intent = new Intent(this, InstallResultReceiver.class);

intent.putExtra("flag", 1);

PendingIntent pendingIntent = PendingIntent.getBroadcast(this,

1, intent,

PendingIntent.FLAG_UPDATE_CURRENT);

session.commit(pendingIntent.getIntentSender());

} catch (Exception e) {

e.printStackTrace();

} finally {

if (session != null) {

session.close();

}

}

}

int mSessionId =-1;

public String installApp(String apkFilePath) {

String success = "fail";

Log.d(TAG, "installApp()------->" + apkFilePath);

File apkFile = new File(apkFilePath);

if (!apkFile.exists()) {

Log.d(TAG, "文件不存在");

}

PackageInfo packageInfo = getPackageManager().getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES);

if (packageInfo != null) {

String packageName = packageInfo.packageName;

int versionCode = packageInfo.versionCode;

String versionName = packageInfo.versionName;

Log.d("ApkActivity", "packageName=" + packageName + ", versionCode=" + versionCode + ", versionName=" + versionName);

}

PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();

PackageInstaller.SessionParams sessionParams

= new PackageInstaller.SessionParams(PackageInstaller

.SessionParams.MODE_FULL_INSTALL);

Log.d(TAG, "apkFile length" + apkFile.length());

sessionParams.setSize(apkFile.length());

try {

mSessionId = packageInstaller.createSession(sessionParams);

} catch (IOException e) {

e.printStackTrace();

}

Log.d(TAG, "sessionId---->" + mSessionId);

if (mSessionId != -1) {

boolean copySuccess = onTransfesApkFile(apkFilePath);

Log.d(TAG, "copySuccess---->" + copySuccess);

if (copySuccess) {

boolean isSuccess = execInstallAPP();

success = isSuccess ? "Success" : "fail";

Log.d(TAG, "静默成功---" + isSuccess);

}

}

return success;

}

private boolean onTransfesApkFile(String apkFilePath) {

Log.d(TAG, "---------->onTransfesApkFile()<---------------------");

InputStream in = null;

OutputStream out = null;

PackageInstaller.Session session = null;

boolean success = false;

try {

File apkFile = new File(apkFilePath);

session = getPackageManager().getPackageInstaller().openSession(mSessionId);

out = session.openWrite("base.apk", 0, apkFile.length());

in = new FileInputStream(apkFile);

int total = 0, c;

byte[] buffer = new byte[1024 * 1024];

while ((c = in.read(buffer)) != -1) {

total += c;

out.write(buffer, 0, c);

}

session.fsync(out);

Log.d(TAG, "streamed " + total + " bytes");

success = true;

} catch (IOException e) {

e.printStackTrace();

} finally {

if (null != session) {

session.close();

}

try {

if (null != out) {

out.close();

}

if (null != in) {

in.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return success;

}

private boolean execInstallAPP() {

Log.d(TAG, "--------------------->execInstallAPP()<------------------");

PackageInstaller.Session session = null;

try {

session = getPackageManager().getPackageInstaller().openSession(mSessionId);

Intent intent = new Intent(this, InstallResultReceiver.class);

intent.putExtra("flag", 1);

PendingIntent pendingIntent = PendingIntent.getBroadcast(this,

1, intent,

PendingIntent.FLAG_UPDATE_CURRENT);

session.commit(pendingIntent.getIntentSender());

return true;

} catch (IOException e) {

e.printStackTrace();

return false;

} finally {

if (null != session) {

session.close();

}

}

}

好文链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。