日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓Apk下载以及静默安装

發(fā)布時間:2024/3/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓Apk下载以及静默安装 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

我們App是定制的Pad,所以已經(jīng)進行過系統(tǒng)簽名,但是靜默安裝這個操作我找了好久才找到合適的,然后就是代碼

首先是Apk下載的方法

// 文件保存路徑private String mSavePath;// 版本名稱private String mVersion_name = "/名稱.apk";/** 開啟新線程下載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;// 計算進度條的當前位置mProgress = (int) (((float) count / length) * 100);Log.e("Base", "下載進度" + 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);//這個地方返回的*intentResult *為null,所以導致代用靜默安裝方法返回的值為**false**,但是app已經(jī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" />

這就是全部的代碼,有幾個點我要聲明一下,首先就是放置Apk的地址以及Apk的名字,大家要自行改一下;其次是調(diào)用靜默安裝后的的返回值,其實返回的是 false,但是App確實是靜默安裝成功的,至于原因我打斷點也沒找到具體的原因,如果有哪位看官懂,麻煩評論下,感謝。最后,以上便是我根據(jù)自己的經(jīng)驗以及參考網(wǎng)上的一些文章得出來的結(jié)論,敬請參考

總結(jié)

以上是生活随笔為你收集整理的安卓Apk下载以及静默安装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。