这一节了解一下普通应用安装app的方式,主要是唤起系统来安装,直接上代码:
申请权限
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
-
- <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- <uses-permission android:name="com.example.permission.SOME_PERMISSION" />
- <uses-permission android:name="android.permission.INSTALL_PACKAGES"
- tools:ignore="ProtectedPermissions" />
- <uses-permission
- android:name="android.permission.WRITE_SETTINGS"
- tools:ignore="ProtectedPermissions" />
- <uses-permission
- android:name="android.permission.ACCESS_SUPERUSER" />
- <uses-permission
- android:name=".PERMISSION" />
-
- <uses-permission
- android:name="android.permission.GET_PACKAGE_SIZE" />
- <uses-permission
- android:name="android.permission.MANAGE_DOCUMENTS"
- tools:ignore="ProtectedPermissions" />
-
- <application>
- ...
- <provider
- android:name="androidx.core.content.FileProvider"
- android:authorities="com.dc.cplustest.fileProvider"
- android:exported="false"
- android:permission="com.example.permission.SOME_PERMISSION"
- android:grantUriPermissions="true">
- <meta-data
- android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/filepaths" />
- provider>
- ...
- application>
res/xml/filepaths.xml
Activity中:
- private static final String[] PERMISSIONS = new String[]{
- android.Manifest.permission.ACCESS_COARSE_LOCATION,
- android.Manifest.permission.READ_EXTERNAL_STORAGE,
- android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
- Manifest.permission.MANAGE_EXTERNAL_STORAGE,
- android.Manifest.permission.INSTALL_PACKAGES,
- Manifest.permission.WRITE_SETTINGS,
- Manifest.permission.REQUEST_INSTALL_PACKAGES
- };
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_second);
- checkInstallPermission();
- initView();
- }
-
-
- public String apk = Environment.getExternalStorageDirectory() + File.separator + "Test" + File.separator + "APK" + File.separator+"fenshen.apk";
- private void initView() {
-
- if (!checkPermissions(PERMISSIONS)) {
- ActivityCompat.requestPermissions(this, PERMISSIONS, 1000);
- }
- findViewById(R.id.btn_test_so).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- install();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- });
- }
-
- public void checkInstallPermission() {
- boolean haveInstallPermission;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- haveInstallPermission = getPackageManager().canRequestPackageInstalls();
- Log.d("Test","Test haveInstallPermission:"+haveInstallPermission);
- if (!haveInstallPermission) {//没有权限让调到设置页面进行开启权限;
- Uri packageURI = Uri.parse("package:" + getPackageName());
- Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
- startActivityForResult(intent, 10086);
- }
- }
- }
-
- public void install() {
- File apkFile = new File(apk);
- Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
- intent.setAction(Intent.ACTION_VIEW);
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- //注意第二个参数,要保持和manifest中android:authorities的值相同
- Uri uri = FileProvider.getUriForFile(SecondActivity.this,
- SecondActivity.this.getPackageName() + ".fileProvider", apkFile);
- intent.setDataAndType(uri, "application/vnd.android.package-archive");
- intent.setData(uri);
- startActivity(intent);
- }
-
- private boolean checkPermissions(String[] neededPermissions) {
- if (neededPermissions == null || neededPermissions.length == 0) {
- return true;
- }
- boolean allGranted = true;
- for (String neededPermission : neededPermissions) {
- Log.d("Test","权限"+neededPermission+"是否已给: "+(ContextCompat.checkSelfPermission(this, neededPermission) == PackageManager.PERMISSION_GRANTED));
- allGranted &= ContextCompat.checkSelfPermission(this, neededPermission) == PackageManager.PERMISSION_GRANTED;
- }
- return allGranted;
- }