安信科技官網-觸屏版

美女免费黄网站-美女免费精品高清毛片在线视-美女免费精品视频在线观看-美女免费毛片-成人在激情在线视频-成人在免费观看视频国产

當前位置:首頁 > 安信自媒體 > 移動微信

Android開發中使用FileProvider解決apk升級包無法安裝的問題

時間:2023年11月29日 瀏覽:

Android使用FileProvider解決apk無法安裝的問題

安卓開發APP,需要提供APP升級包安裝時,提示出現下面的問題:

W/System.err: android.os.FileUriExposedException: file:///xxxx/xxxx/xxxx/updata.apk exposed beyond app through Intent.getData()

上面的錯誤代碼中:updata.apk為升級包。
通用使用下面的方法解決處理:

1.配置mainfest信息,在mainfest的application結點內添加如下代碼:
android:name="androidx.core.content.FileProvider"
android:authorities="com.anxin.myapp.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
tools:ignore="WrongManifestParent">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />


上面的代碼中:
android:authorities 這里使用的是包名。這個其實可以隨便寫,換成自己的包名就都可以。
android:resource 這里配置一個 xml文件。命名為:filepaths.

2.在xml下創建filepaths.xml文件如下:
<paths>
    <external-path name="." path="."/>
</paths>


以下代碼說明:
external-path 是放到sd卡的目錄下 Environment.getExternalStorageDirectory()
path="." 代表共享 sd卡下的所有目錄。會遍歷sd卡下的所有目錄,來匹配你要安裝 的apk 的目錄。。
name="." 代表apk存放目錄下所有apk的名字都會遍歷一遍,然后跟你要安裝的apk進行匹配

3.以下是判斷遠程升級包版本號,并下載、安裝升級包APP的代碼:

public class Updateapk extends BaseData {
Context context;
private RadioGroup mRg;
ImageView iv_back;
String url="http://遠程服務器/getjson/getnewversion";
TextView tv_versionName,tv_versioninfo;
Button btn_backusercenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.updateapk);
initRadioGroup();
findViewById();
loadData(url);
}
private void findViewById() {
iv_back=findViewById(R.id.iv_back);
iv_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
btn_backusercenter=findViewById(R.id.btn_backusercenter);
btn_backusercenter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
public void onSuccess(String result) {
try {
parseShowData(result);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}

private void parseShowData(String result) throws PackageManager.NameNotFoundException {
BeanUpdate bean=new Gson().fromJson(result,BeanUpdate.class);
Integer serviceVersionCode= bean.getServiceversionCode();
String serviceversionName=bean.getServiceversionName();
String serviceversionInfo=bean.getServiceversionInfo();
tv_versionName=findViewById(R.id.tv_versionName);
tv_versionName.setText("新版本待升級,新版本號:"+serviceversionName);
tv_versioninfo=findViewById(R.id.tv_versioninfo);
tv_versioninfo.setText(serviceversionInfo);
if (getVersionCode() < serviceVersionCode) {
showDialogUpdate();

}else{
Toast.makeText(this,"當前已經是最新的版本", Toast.LENGTH_SHORT).show();
}
}
private void showDialogUpdate() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("版本升級").
setIcon(R.mipmap.ic_launcher).
setMessage("發現新版本!請及時更新").
setPositiveButton("確定", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
loadNewVersionProgress();//下載最新的版本程序
}
}).
setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent=new Intent();
intent.setClass(Updateapk.this, UserCenter.class);
startActivity(intent);
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
/**
* 下載新版本程序,需要子線程
*/
private void loadNewVersionProgress() {
final String uri="http://xxxx.xxxx.com/updata.apk";
final ProgressDialog pd;//進度條對話框
pd = new  ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在下載更新");
pd.show();
//啟動子線程下載任務
new Thread(){
@Override
public void run() {
try {
File file = getFileFromServer(uri, pd);
sleep(3000);
installApk(file);
pd.dismiss();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "下載新版本失敗", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}}.start();
}
/**
* 從服務器獲取apk文件的代碼
* 傳入網址uri,進度條對象即可獲得一個File文件(要在子線程中執行哦)
*/
public static File getFileFromServer(String uri, ProgressDialog pd) throws Exception{
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
URL url = new URL(uri);
HttpURLConnection conn =  (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
pd.setMax(conn.getContentLength());
InputStream is = conn.getInputStream();
long time= System.currentTimeMillis();
File file = new File(Environment.getExternalStorageDirectory()+"/Download/", time+"updata.apk");
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len ;
int total=0;
while((len =bis.read(buffer))!=-1){
fos.write(buffer, 0, len);
total+= len;
pd.setProgress(total);
}
fos.close();
bis.close();
is.close();
return file;
}
else{
return null;
}
}

/**
* 安裝apk
*
* @param file
*/
private void installApk(File file) {
//File file = new File(fileSavePath);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri data;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判斷版本大于等于7.0
// "com.anxin.loveenglish.fileprovider"即是在清單文件中配置的authorities
// 通過FileProvider創建一個content類型的Uri
data = FileProvider.getUriForFile(this, "com.anxin.loveenglish.fileprovider", file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 給目標應用一個臨時授權
} else {
data = Uri.fromFile(file);
}
intent.setDataAndType(data, "application/vnd.android.package-archive");
startActivity(intent);
}

@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast toast =Toast.makeText(this, "當前為最新版本,不需要升級!", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
Intent intent=new Intent();
intent.setClass(Updateapk.this, UserCenter.class);
startActivity(intent);
}

/*獲取當前程序的版本號*/

private int getVersionCode() throws PackageManager.NameNotFoundException {
//獲取packagemanager的實例
PackageManager packageManager = getPackageManager();
//getPackageName()是你當前類的包名,0代表是獲取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);
return packInfo.versionCode;
}
}


最后說明下,http://遠程服務器/getjson/getnewversion

這里獲取的是遠程服務器中設置的APP新版本信息,以tp6.0為例:

class Getjson extends Base{
public function getnewversion(){
$data['serviceversionName']='1.2.0';
$data['serviceversionCode']=2;
$data['serviceversionInfo']='最新版本說明文字';
return json($data);
}

上面的代碼:serviceversionCode使用自然數,不要使用帶小數點。


當前頁面電腦端訪問網址:


發送給朋友 分享到朋友圈

手機版電腦版

日韩在线观看视频免费| 国产视频一区二区在线观看| 精品视频在线观看一区二区| 日韩中文字幕在线观看视频| 国产不卡福利| 国产精品1024永久免费视频 | 成人免费观看的视频黄页| 午夜家庭影院| 成人免费观看视频| 台湾美女古装一级毛片| 精品在线免费播放| 日韩在线观看免费完整版视频| 在线观看导航| 国产成人精品在线| 色综合久久天天综合| 亚洲精品影院一区二区| 毛片高清| 九九精品久久| 99色吧| 亚洲精品久久久中文字| 成人在激情在线视频| 99热精品在线| 国产网站免费在线观看| 亚洲天堂免费| 日日爽天天| 91麻豆精品国产高清在线| 四虎影视精品永久免费网站| 在线观看导航| 超级乱淫黄漫画免费| 国产综合成人观看在线| 韩国毛片免费大片| 午夜欧美福利| 成人av在线播放| 欧美激情影院| 精品视频在线观看视频免费视频| 午夜在线亚洲| 免费一级生活片| 欧美激情一区二区三区视频高清| 99热精品在线| 精品在线免费播放| 色综合久久天天综合绕观看| 欧美日本免费| 国产麻豆精品高清在线播放| 99久久网站| 天天做人人爱夜夜爽2020| 91麻豆爱豆果冻天美星空| 成人免费观看视频| 国产精品免费久久| 国产综合91天堂亚洲国产| 精品视频在线观看视频免费视频 | 色综合久久天天综合观看| 91麻豆精品国产高清在线| 免费的黄色小视频| a级精品九九九大片免费看| 国产一区免费观看| 你懂的日韩| 亚洲www美色| 日韩专区亚洲综合久久| 一a一级片| 一本高清在线| 成人影院一区二区三区| 99久久精品国产国产毛片 | 中文字幕97| 九九热国产视频| 亚洲精品久久玖玖玖玖| 999久久久免费精品国产牛牛| 色综合久久天天综线观看| 日韩av成人| 日本在线不卡免费视频一区| 国产a视频| 国产一区精品| 亚洲精品影院| 久久精品免视看国产明星| 精品国产一区二区三区久久久狼 | 日韩在线观看视频免费| 欧美国产日韩精品| 国产麻豆精品| 欧美大片a一级毛片视频| 国产成人啪精品视频免费软件| 九九精品久久久久久久久| 国产一区二区精品在线观看| 久久国产精品永久免费网站| 国产成人啪精品视频免费软件| 日韩在线观看免费| 国产91丝袜高跟系列| 国产视频一区在线| 色综合久久天天综合观看| 国产原创中文字幕| 日韩在线观看网站| 国产一区二区精品在线观看| 国产成人欧美一区二区三区的| 99久久精品国产麻豆| 国产精品自拍一区| 日本伦理黄色大片在线观看网站| 黄视频网站在线观看| 91麻豆精品国产高清在线| 亚洲精品中文字幕久久久久久| 国产麻豆精品| 久草免费在线视频| 欧美爱色| 欧美大片一区| 国产91视频网| 欧美一级视| 精品视频免费看| 国产亚洲免费观看| 99久久精品国产国产毛片 | a级毛片免费观看网站| 欧美另类videosbestsex视频| 久久成人亚洲| 99久久精品国产高清一区二区 | 99久久精品国产国产毛片 | 久久国产精品只做精品| 国产激情一区二区三区| 欧美1卡一卡二卡三新区| 999精品在线| 国产视频一区二区三区四区| 国产成人欧美一区二区三区的| 香蕉视频久久| 色综合久久天天综合| 你懂的日韩| 99久久精品国产国产毛片 | 黄视频网站在线观看| 欧美18性精品| 韩国三级香港三级日本三级la| 国产综合成人观看在线| 999久久狠狠免费精品| 国产亚洲精品成人a在线| 午夜家庭影院| 99色视频在线观看| 美国一区二区三区| 日韩av成人| 欧美a免费| 国产一区二区精品| 你懂的日韩| 欧美另类videosbestsex久久| 国产高清视频免费观看| 天天做日日爱| 天天做人人爱夜夜爽2020| 免费的黄色小视频| 欧美激情中文字幕一区二区| 二级片在线观看| 成人高清视频在线观看| 九九九网站| 色综合久久天天综合观看| 欧美激情在线精品video| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 97视频免费在线| 九九免费高清在线观看视频| 国产美女在线一区二区三区| 国产视频一区二区三区四区| 日韩一级精品视频在线观看| 欧美一级视| 久久国产一区二区| 九九热国产视频| 欧美激情一区二区三区在线| 国产视频久久久久| 免费一级生活片| 国产美女在线观看| 天天色成人| 色综合久久手机在线| 成人免费一级毛片在线播放视频| 国产伦久视频免费观看视频| 国产成人精品综合| 国产伦理精品| 久久久久久久网| 日韩中文字幕一区| 韩国毛片| 四虎影视库国产精品一区| 久久99中文字幕久久| 美女免费毛片| 九九九国产| 韩国毛片免费大片| 人人干人人插| 青青久久精品| 天天色成人网| 欧美激情一区二区三区在线播放| 欧美激情伊人| 91麻豆精品国产综合久久久| 欧美激情影院| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 一本高清在线| 一a一级片| 欧美另类videosbestsex| 日韩在线观看视频黄| 国产成人精品在线| 国产一区二区精品久久91| 国产综合91天堂亚洲国产| 精品久久久久久中文字幕一区| 国产伦精品一区三区视频| 欧美激情伊人| 美国一区二区三区| 久久福利影视| 精品视频在线观看免费| 亚洲天堂一区二区三区四区| 99久久精品费精品国产一区二区| 韩国三级香港三级日本三级la| 青草国产在线观看| 成人免费一级毛片在线播放视频| 日韩一级精品视频在线观看| 久久福利影视|