Android笔记--应用安装

这一节了解一下普通应用安装app的方式,主要是唤起系统来安装,直接上代码:

申请权限

XML 复制代码
<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中:

java 复制代码
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;
    }
相关推荐
峥嵘life2 分钟前
Android 切换用户后无法获取 MAC 地址分析解决
android·python·macos
JJay.6 分钟前
Android BLE 为什么连上了却收不到数据
android
歪楼小能手7 分钟前
Android16在开机向导最后添加一个声明界面
android·java·平板
夏沫琅琊9 分钟前
Android联系人导入导出
android·kotlin
Naiva10 分钟前
《Fundamentals of Power Electronics 》章节1 Introduction
笔记
zh_xuan15 分钟前
把Android Library 上传到github并在工程中引用该远程仓库
android·github·远程仓库
诸神黄昏EX18 分钟前
Android Google MADA
android
Better Bench19 分钟前
《格林童话》阅读笔记
笔记
盖丽男19 分钟前
使用 GitHub Actions 自动打包 Android APK
android·github
东京老树根23 分钟前
SAP学习笔记 - BTP SAP Build08 - BPA Condition,Decision Table
笔记·学习