安卓Apk下载以及静默安装
生活随笔
收集整理的這篇文章主要介紹了
安卓Apk下载以及静默安装
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言:
我們App是定制的Pad,所以已經(jīng)進(jìn)行過(guò)系統(tǒng)簽名,但是靜默安裝這個(gè)操作我找了好久才找到合適的,然后就是代碼
首先是Apk下載的方法
// 文件保存路徑private String mSavePath;// 版本名稱private String mVersion_name = "/名稱.apk";/** 開(kāi)啟新線程下載apk文件*/private void downloadAPK(String mUrl) {new Thread(new Runnable() {@Overridepublic void run() {try {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String sdPath = Environment.getExternalStorageDirectory() + "/"; // 文件保存路徑 // mSavePath = sdPath + "jikedownload";mSavePath = "/data/user/0/包名/files"; // mSavePath = "/data/local/tmp/";File dir = new File(mSavePath);if (!dir.exists()) {dir.mkdir();}// 下載文件HttpURLConnection conn = (HttpURLConnection) new URL(mUrl).openConnection();conn.connect();InputStream is = conn.getInputStream();int length = conn.getContentLength();File apkFile = new File(mSavePath, mVersion_name);FileOutputStream fos = new FileOutputStream(apkFile);int count = 0;byte[] buffer = new byte[1024];while (!mIsCancel) {int numread = is.read(buffer);count += numread;// 計(jì)算進(jìn)度條的當(dāng)前位置mProgress = (int) (((float) count / length) * 100);Log.e("Base", "下載進(jìn)度" + mProgress);// 下載完成if (numread < 0) {Log.e("Base", "下載完成"); // mUpdateProgressHandler.sendEmptyMessage(2);//靜默安裝StringBuilder append = new StringBuilder().append(mSavePath).append(mVersion_name);boolean installResult = Install.silentInstallApk(mContext,append.toString());Log.e("Base", "安裝結(jié)果" + installResult); // break;}fos.write(buffer, 0, numread);}fos.close();is.close();}} catch (Exception e) {e.printStackTrace();}}}).start();}然后就是靜默安裝的代碼
/*** 靜默安裝*/ public class Install {private final static SynchronousQueue<Intent> mInstallResults = newSynchronousQueue<>();@TargetApi(Build.VERSION_CODES.LOLLIPOP)public static synchronized boolean silentInstallApk(Context context,final String apkFilePath) {boolean ret = false;File apkFile = new File(apkFilePath);PackageInstaller installer = context.getPackageManager().getPackageInstaller();PackageInstaller.SessionParams sessionParams = newPackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);sessionParams.setSize(apkFile.length());int sessionId = createSession(installer, sessionParams);if (sessionId != -1) {boolean isCopyOk = copyInstallApkFile(sessionId, installer, apkFilePath);if (isCopyOk) {boolean isInstalled = installPackage(context, sessionId,installer, apkFilePath);if (isInstalled) {ret = true;}}}return ret;}@TargetApi(Build.VERSION_CODES.LOLLIPOP)private static int createSession(PackageInstaller installer,PackageInstaller.SessionParams sessionParams) {int sessionId = -1;try {sessionId = installer.createSession(sessionParams);} catch (IOException e) {e.printStackTrace();}return sessionId;}@TargetApi(Build.VERSION_CODES.LOLLIPOP)private static boolean copyInstallApkFile(int sessionId, PackageInstaller installer,String apkFilePath) {InputStream in = null;OutputStream out = null;PackageInstaller.Session session = null;boolean ret = false;try {File apkFile = new File(apkFilePath);session = installer.openSession(sessionId);out = session.openWrite("base.apk", 0, apkFile.length());in = new FileInputStream(apkFile);File file = new File(String.valueOf(apkFile));if (file.exists()) {Log.i("Base", "存在");}int count;byte[] buffer = new byte[65536];while ((count = in.read(buffer)) != -1) {out.write(buffer, 0, count);}session.fsync(out);ret = true;} catch (IOException e) {e.printStackTrace();} finally {try {out.close();} catch (IOException e) {e.printStackTrace();}try {if (in != null) {in.close();}} catch (IOException e) {e.printStackTrace();}session.close();}return ret;}@TargetApi(Build.VERSION_CODES.LOLLIPOP)private static boolean installPackage(Context context, int sessionId,PackageInstaller installer, String filePath) {PackageInstaller.Session session = null;boolean ret = false;try {session = installer.openSession(sessionId);Intent intent = new Intent();intent.setAction("com.example.install");PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent,PendingIntent.FLAG_UPDATE_CURRENT);session.commit(pendingIntent.getIntentSender());final Intent intentResult = mInstallResults.poll(60, TimeUnit.SECONDS);//這個(gè)地方返回的*intentResult *為null,所以導(dǎo)致代用靜默安裝方法返回的值為**false**,但是app已經(jīng)成功靜默安裝成功了,至于原因//筆者也暫時(shí)沒(méi)有找到,如果有哪位看官懂,麻煩評(píng)論下,感謝if (intentResult != null) {final int status = intentResult.getIntExtra(PackageInstaller.EXTRA_STATUS,PackageInstaller.STATUS_FAILURE);if (status == PackageInstaller.STATUS_SUCCESS) {ret = true;}}} catch (Exception e) {e.printStackTrace();} finally {session.close();}return ret;}}最后是權(quán)限,一定不要忘了
<uses-permission android:name="android.permission.INSTALL_PACKAGES" /><uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />這就是全部的代碼,有幾個(gè)點(diǎn)我要聲明一下,首先就是放置Apk的地址以及Apk的名字,大家要自行改一下;其次是調(diào)用靜默安裝后的的返回值,其實(shí)返回的是 false,但是App確實(shí)是靜默安裝成功的,至于原因我打斷點(diǎn)也沒(méi)找到具體的原因,如果有哪位看官懂,麻煩評(píng)論下,感謝。最后,以上便是我根據(jù)自己的經(jīng)驗(yàn)以及參考網(wǎng)上的一些文章得出來(lái)的結(jié)論,敬請(qǐng)參考
總結(jié)
以上是生活随笔為你收集整理的安卓Apk下载以及静默安装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【云原生 | Kubernetes 系列
- 下一篇: 玩瓶子的老头