android实现用代码安装apk,费了半天时间,已经调通,
在android 手机7.1版本运行本代码可以安装另外一个apk,分享给大家
2020-08-13
步骤:
1. 连手机,as用file explorer上传另外一个apk到: com.example.myinstallapk/apks/a.apk"
2. 运行本代码,可以自动安装另外一个apk
代码如下:
1. mainacitivity:
注意用的是file provider
package com.example.myinstallapk;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import java.io.File;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Context context = getApplicationContext();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory("android.intent.category.DEFAULT");
String filePath = Environment.getDataDirectory()+"/data"+"/com.example.myinstallapk"+"/apks"+"/a.apk";
File file = new File(filePath);
//判断是否是AndroidN以及更高的版本
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.N) {
Log.i("main", "---BuildConfig.APPLICATION_ID: "+ BuildConfig.APPLICATION_ID);
Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", file);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(contentUri,"application/vnd.android.package-archive");
}else{
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
}
startActivity(intent);
}
}
2. 修改manifest,增加一个provider
3. 增加xml下的filepath.xml
注意:我调试时遇到:
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.example.myinstallapk/apks/a.apk
在filepath.xml增加了root-path 就偶了