一. 安裝和文件讀寫權(quán)限
在manifast.xml配置文件中政模,添加以下權(quán)限:
<!--安裝未知來源應(yīng)用的權(quán)限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!--聯(lián)網(wǎng)權(quán)限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--文件讀寫權(quán)限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
其中,聯(lián)網(wǎng)權(quán)限和文件讀寫權(quán)限要在 項(xiàng)目中動(dòng)態(tài)申請權(quán)限耗式。
二. provider文件權(quán)限
在 mainfast 的配置文件中加入FileProvider注冊(注意:provider 和 activity 標(biāo)簽同級趁猴,都是 application 標(biāo)簽的子類):
<application>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/retrohttp_files" />
</provider>
</application>
authorities="${applicationId}"值為你項(xiàng)目的applicationId,一般在app——model的buidle.gradle中或配置文件config.gradle中娱挨,參數(shù)值位置大如下所示:
compileSdkVersion 28
defaultConfig {
applicationId "com.p.atestdemo"
minSdkVersion 17
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
位置類似上面的 applicationId 后面跟的值捕犬。
按一般流程來說,需要在你項(xiàng)目的 res文件夾下建 xml文件 updat_files.xml(文件名自己定義)碉碉。由于RetroHttp庫里面已經(jīng)新建了retrohttp_files.xml文件,所以,如果你項(xiàng)目中要用的話缸濒,只需要如上所述在provider中加“meta-data”標(biāo)簽,類似如下:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/retrohttp_files" />
</provider>
三. 下載安裝方法的使用
前面權(quán)限都已經(jīng)弄好后斩跌,當(dāng)涉及到apk文件下載和安裝的時(shí)候,你可以類似這樣:
String url="http://xxx.xxx.cn:3366/down/baidu.apk";//為示例代碼url
//啟動(dòng)下載
ProgressDialog progressDialog = DownLoadHelper.getInstance().showDownLoading(mContext);
DownLoadHelper.getInstance().setFileName("abc.apk")//設(shè)置apk文件名
.setIcon(R.mipmap.ic_launcher)//設(shè)置apk圖標(biāo)資源id
.setAuthorityTag("com.p.atestdemo")//設(shè)置要與清單文件的 provider 中配置的authorities值一致
.downLoadFile(url, MainActivity.this, new DownLoadHelper.DownloadListener() {
@Override
public void onStart() {
}
@Override
public void update(int progress, boolean done) {
progressDialog.setProgress((int) (progress * 1f));
}
@Override
public void onCompleted() {
progressDialog.dismiss();
}
@Override
public void onError(String err) {
progressDialog.dismiss();
LogUtil.i("=========下載失敗=====");
//下載失敗的邏輯
//......
}
});
這樣耀鸦,就可以下載新的apk文件進(jìn)行安裝了袖订。不過在調(diào)用這個(gè)下載方法前嗅虏,我們最好先判斷下手機(jī)內(nèi)存是否足夠。