日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android 通過代碼安裝 APK的方法詳解

瀏覽:23日期:2022-09-23 15:31:03

在 APK 開發(fā)中,通過 Java 代碼來打開系統(tǒng)的安裝程序以安裝 APK 并不是什么難事,一般的 Android 系統(tǒng)都有開放這一功能。

但隨著 Android系統(tǒng)版本的迭代,其對于權(quán)限的把控越來越嚴(yán)格,或者說是變得越來越注重安全性。這就導(dǎo)致了以前可以通過很簡單的幾行代碼就能實(shí)現(xiàn)的功能,現(xiàn)在要復(fù)雜很多。 對于通過代碼打開系統(tǒng)安裝程序這一功能的限制,其分水嶺在 Android7.0,即 Android N 上。通常在 Android N以上的系統(tǒng)使用一種做法,以下則使用另一種做法。 傳統(tǒng)的通過代碼安裝APK的方式

File apk = new File(...);Uri uri = Uri.fromFile(apk);Intent intent = new Intent();intent.setClassName('com.android.packageinstaller', 'com.android.packageinstaller.PackageInstallerActivity');intent.setData(uri);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);

這種方法簡單粗暴且實(shí)用,只要知曉要安裝的 APK 的位置,并擁有訪問權(quán)限即可。但現(xiàn)在市面上主流的 Android 手機(jī)系統(tǒng)版本都已經(jīng)要高于 7.0 了,這一方法幾乎已經(jīng)沒有用了

高版本系統(tǒng)上的通過代碼安裝APK的方式

File apk = new File(...);Intent intent = new Intent(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);Uri uri = FileProvider.getUriForFile(this, 'com.apk.demo.fileprovider', apk);intent.setDataAndType(uri, 'application/vnd.android.package-archive');startActivity(intent);

說到權(quán)限問題,在Android版本不斷提高的趨勢下,系統(tǒng)得安全性也越來越高,很多權(quán)限不只是在清單文件里面注冊那么簡單,內(nèi)存卡得讀寫權(quán)限屬于危險(xiǎn)權(quán)限,需要我們使用代碼動(dòng)態(tài)添加,這里我使用了RxPermiision框架,遇到9.0或者更高版本的系統(tǒng)時(shí)獲取權(quán)限的方法可能會(huì)不同。

private void rxPermission() { RxPermissions rxPermissions = new RxPermissions(this); rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean granted) throws Exception { if (granted) { //權(quán)限允許 //在這里可以添加自己的操作 } else { // 權(quán)限被拒絕 } } }); }

Android更多權(quán)限得查詢:https://www.jianshu.com/p/24f79a70025b

上面這段代碼安裝代碼看起來似乎和傳統(tǒng)的方式并沒有太大的區(qū)別是嗎?

確實(shí)是,但它真正的區(qū)別并沒有在 Java 代碼上體現(xiàn)出來。

在高版本系統(tǒng)中,APK 已經(jīng)不能直接訪問其它 APK 的私有數(shù)據(jù)了。

什么是APK的私有數(shù)據(jù)?

APK在安裝過程中于 data 目錄下創(chuàng)建的專屬目錄自然是其私有數(shù)據(jù)無疑。另外,只要是在應(yīng)用程序中封裝的 File 對象,不管這個(gè)文件本身是不是由該程序創(chuàng)建的,那這個(gè)文件都屬于該程序的“私有數(shù)據(jù)”。舉個(gè)例子來說,假設(shè)我們將手機(jī)連接到電腦,通過 adb push 的方式往 sdcard 目錄下推了一個(gè) APK 文件進(jìn)去。然后我們自行編寫了一段代碼,將這個(gè) sdcard 中的安裝包傳到系統(tǒng)的 PackageInstaller 中去安裝,都會(huì)報(bào)安全錯(cuò)誤,因?yàn)檫@個(gè)位于 sdcard 目錄下文件對我們這段代碼來說是“私有數(shù)據(jù)”,不允許直接暴露給 PackageInstaller。

下面就來看看在高版本系統(tǒng)中暴露“私有數(shù)據(jù)”給其它程序的方法。

在高版本中,Android7.0 及以上,開放(暴露)私有數(shù)據(jù)的唯一方式是通過 ContentProvider 來實(shí)現(xiàn)。

具體的步驟大致如下:

配置 AndroidManifest.xml 中的 ContentProvider 信息; 配置要開放的 paths 信息; 在 Java 代碼中通過 FileProvider 封裝文件信息。

1、AndroidManifest.xml 配置

前面說過,高版本系統(tǒng)中其實(shí)就是將以前的直接開放變成通過 ContentProvider 來間接開放。因此我們需要在 AndroidManifest.xml 中添加一個(gè) provider 標(biāo)簽,示例如下:

<provider android:name='androidx.core.content.FileProvider' android:authorities='com.your.app.fileprovider' android:exported='false' android:grantUriPermissions='true'> <meta-data android:name='android.support.FILE_PROVIDER_PATHS' android:resource='@xml/file_paths' /></provider> android:name 屬性填寫的是 FileProvider 類的完整名稱。這個(gè)類可以填寫兩個(gè)值,一個(gè)是位于 support(android.support.v4.content.FileProvider) 包下的,另一個(gè)是位于 androidx(androidx.core.content.FileProvider) 包下的。這兩種都可以填寫,本質(zhì)上沒有區(qū)別。但是要根據(jù)實(shí)際情況來決定用哪個(gè),即要看你的工程引的是 androidx 支援包還是 support 支援包。關(guān)于 support 與 androidx 的關(guān)系本文就不再贅述了。 android:authorities 屬性就是和普通的 ContentProvider 一樣的用于訪問文件資源的 uri 標(biāo)簽頭。值內(nèi)容根據(jù)實(shí)際需要來填寫即可。 android:exported這個(gè)屬性表示的是:其他app能否訪問這個(gè)provider android:grantUriPermissions 這個(gè)屬性用于給內(nèi)容提供器的數(shù)據(jù)子集授權(quán) 如果內(nèi)容提供器的grantUriPermissions屬性被設(shè)置為true,那么權(quán)限能夠被授予內(nèi)容提供器范圍內(nèi)的任何數(shù)據(jù)。但是,如果grantUriPermission屬性被設(shè)置為false,那么權(quán)限就只能授予這個(gè)元素所指定的數(shù)據(jù)子集。一個(gè)內(nèi)容提供器能夠包含任意多個(gè)元素。每個(gè)都只能指定一個(gè)路徑(三個(gè)可能屬性中的一個(gè))。 meta-data 標(biāo)簽中的內(nèi)容需要關(guān)注的是 android:resource 屬性中的內(nèi)容。這個(gè)屬性的值引向一個(gè)自行配置的 xml 文件,這份 xml 文件記載的是設(shè)備中的路徑信息,簡單理解就是你想開放哪些目錄中的文件資源給第三方使用的意思。關(guān)于這個(gè) xml 的配置請看第 2 步的記載。

2、paths 配置

通常的做法是在工程 res 目錄下新建一個(gè) xml 目錄,并在該 xml 目錄下新建一個(gè) xml 文件。文件的名稱必須與第 1 步中 @xml/ 屬性值中配置的一致。 根據(jù)第 1 步中的示例代碼,我們需要新建一個(gè) file_paths.xml 文件。這里我的apk是保留在程序的file文件加下得,該文件的內(nèi)容如下所示:

<?xml version='1.0' encoding='utf-8'?><paths> <files-path path='apk/' name='apk' /></paths>

其他路徑的的配置方式請參考:https://editor.csdn.net/md?articleId=106670247

簡單來說,就是將你要開放出去的路徑的類型選好,然后填上該類型下的相對路徑即可。我們以示例詳細(xì)說說:

<?xml version='1.0' encoding='utf-8'?><paths> <files-path path='apk/' name='apk' /></paths>

這表示我們想開放 程序內(nèi)存里面的files目錄,然后在 files 目錄下的子路徑是 /apk,組合成絕對路徑就是 /data/con.xxx.xxx/files/apk 。至于 name 標(biāo)簽則是用于 ContentProvider 標(biāo)識(shí)使用的,一般來講按需要設(shè)置成不同的值就可以了,這里我有一個(gè)子目錄。

3、Java 代碼配置

Java 代碼的配置就沒什么特別的了,直接以章節(jié)首部的代碼來用就可以了。關(guān)鍵的代碼其實(shí)只有一行:

Uri uri = FileProvider.getUriForFile(context, authority, file);

這里的三個(gè)參數(shù)分別為:

context:這里表示需要傳一個(gè)上下文過來 authority:可以通代碼在AndroidManifest.xml里面獲得 file:是你需要的安裝的文件

String authority = new StringBuilder(packageName).append('.provider').toString();//這里的strFile文件的路徑+名稱;例如:/data/file/apk/xxx.apkFile f=new File(strFile);Uri uri = FileProvider.getUriForFile(context, authority, file);

通常我們都會(huì)兼顧 Android 高低版本的系統(tǒng),因此會(huì)使用如下所示的“混合型”代碼:

public void install(){try{//這里有文件流的讀寫,需要處理一下異常Intent intent = new Intent(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){//如果SDK版本>=24,即:Build.VERSION.SDK_INT >= 24 String packageName = context.getApplicationContext().getPackageName(); String authority = new StringBuilder(packageName).append('.provider').toString(); uri = FileProvider.getUriForFile(context, authority, file); intent.setDataAndType(uri, 'application/vnd.android.package-archive'); } else{ uri = Uri.fromFile(file); intent.setDataAndType(uri, 'application/vnd.android.package-archive');}context.startActivity(intent);}catch (Exception e) { e.printStackTrace(); }}

總結(jié)

到此這篇關(guān)于Android 通過代碼安裝 APK的方法詳解的文章就介紹到這了,更多相關(guān)android 代碼安裝apk內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩高清中文字幕一区二区| 蜜桃av一区| 国产日产精品_国产精品毛片 | 亚洲中字黄色| 精品国产一区二区三区av片| 久久亚洲专区| 久久久久97| 亚洲区国产区| 91精品国产成人观看| 国产精品片aa在线观看| 视频一区中文字幕国产| 中文字幕在线官网| 免费看久久久| 国产日韩欧美高清免费| 91精品视频一区二区| av中文字幕在线观看第一页| 亚洲一区日韩| 日韩精品一区二区三区免费观影 | 青草综合视频| 最新日韩av| 精品视频一二| 青草国产精品| 久久高清精品| 激情综合激情| 精品精品国产三级a∨在线| 亚洲欧美日韩在线观看a三区 | 精品欧美日韩精品| 亚洲精品一级二级| 日韩三级精品| 欧美午夜精彩| 韩国女主播一区二区三区| 亚洲免费中文| 91精品国产乱码久久久久久久| 日韩一区三区| 日本伊人午夜精品| 91精品国产自产精品男人的天堂| 日韩精品三区四区| 精品一区二区三区中文字幕 | 欧美日本不卡高清| 精品视频黄色| 久久中文字幕av| 视频一区中文字幕国产| 国产精品嫩模av在线| 精品久久影院| 视频一区中文字幕国产| 高清一区二区三区| 久久国产88| 国产精品综合色区在线观看| 999国产精品视频| 亚洲专区视频| 欧美成人aaa| 亚洲无线一线二线三线区别av| 天堂va欧美ⅴa亚洲va一国产| 久久久久国产| 精品五月天堂| 欧美黑人巨大videos精品| 国产情侣久久| 欧美亚洲免费| 老牛影视一区二区三区| 99久久99久久精品国产片果冰| 久久中文在线| 粉嫩av一区二区三区四区五区| 欧美日韩18| 日韩高清一区在线| 日韩精品成人| 国产精品传媒麻豆hd| 蜜臀久久99精品久久久久久9| 亚洲香蕉网站| 国产女优一区| 日韩精品视频网| 国产精品视频一区二区三区综合| 国产精品一区亚洲| 欧美激情99| 久久视频一区| 婷婷亚洲综合| 日韩有码av| 欧美激情aⅴ一区二区三区| 久久精品欧洲| 99久久夜色精品国产亚洲1000部| 欧美精品一二| 婷婷综合成人| 婷婷亚洲精品| 成人影视亚洲图片在线| 91精品国产乱码久久久久久久| 激情综合网站| 日本va欧美va精品| 福利在线一区| 久久超级碰碰| 视频一区日韩精品| 久久99视频| 午夜精品成人av| 夜夜嗨一区二区| 日本一区中文字幕| 久久午夜影院| 日本一区二区高清不卡| 成人欧美一区二区三区的电影| 久久精品午夜| 久久久久久久久久久9不雅视频| 一本一本久久| 久久精品国产在热久久| 欧美精品日日操| 伊人久久亚洲影院| 四虎成人精品一区二区免费网站| 久久精品国内一区二区三区| 久久久久久黄| 亚洲视频国产精品| 精品网站999| 悠悠资源网久久精品| 欧美亚洲免费| 久久青草久久| 欧美亚洲国产日韩| 国产传媒在线观看| 中文字幕一区二区三区日韩精品 | 国精品一区二区| 自拍自偷一区二区三区| 久久av国产紧身裤| 亚洲欧美成人综合| 国产精品3区| 欧美特黄视频| 精品一区二区三区中文字幕 | 日韩高清一区| 日韩av一级| 国产精品亚洲综合久久| 99久久精品网站| 久久av导航| 日韩高清在线一区| 激情婷婷欧美| 国产在线不卡| 久草免费在线视频| 久久狠狠久久| 亚洲欧美日本国产专区一区| 91精品一区二区三区综合| 国产日产精品_国产精品毛片| 99精品在线观看| 日韩一区二区在线免费| 精品亚洲a∨| 国产图片一区| 蜜桃一区二区三区在线| 亚洲精品裸体| 欧美成a人片免费观看久久五月天| 国产一区二区三区黄网站| 亚洲国产影院| 97精品国产| 午夜欧美精品| 精品国产乱码久久久久久1区2匹| 狠狠干成人综合网| 激情久久99| 亚洲2区在线| 黑森林国产精品av| 久久成人国产| 欧美好骚综合网| 日韩av影院| 亚欧成人精品| 美国三级日本三级久久99| 久久福利精品| 欧美日韩va| 国产精品自在| 久久国产精品免费一区二区三区| 久久久久久亚洲精品美女| 国产aⅴ精品一区二区三区久久| 偷拍精品精品一区二区三区| 亚洲三级精品| 久久精品 人人爱| 国产精品久久久久9999高清| 粉嫩av一区二区三区四区五区| 久久av网址| 欧美高清不卡| 综合一区在线| 成人污污视频| 激情视频网站在线播放色| 日韩精品水蜜桃| 国产探花一区二区| 91精品韩国| 蜜桃av一区二区三区电影| 91麻豆精品激情在线观看最新| 日韩欧美三级| 国产美女一区| 老色鬼精品视频在线观看播放| 国产中文在线播放| 亚洲毛片网站| 蜜臀av免费一区二区三区| 精品视频在线你懂得| 国产欧美高清视频在线| 国产精品毛片在线看| 国产亚洲一区二区手机在线观看 | 丝袜美腿诱惑一区二区三区 | 日韩精品不卡一区二区| 日韩精品导航| 亚洲一区二区三区无吗| 久久青草久久| 国产欧美日韩一区二区三区四区| 久久a爱视频| 蜜臀av在线播放一区二区三区| 在线成人动漫av| 色婷婷久久久| 精品久久久中文字幕| 国产一区二区三区天码| 国产探花在线精品| 欧美激情在线精品一区二区三区| 国产一二在线播放|