如何在高于 24 的目标 SDK 中打开 apk 文件?

how can open an apk file in a target SDK higher than 24?

我有一个下载 apk 文件的应用程序。在我的应用程序中,我下载了一个 apk 文件并希望在下载后安装此 apk 文件 finished.I 在我的 phone 上用 api 19 测试它并且它可以工作。但它不适用于 nougat version.how 可以更改此代码以真正适用于 nougat 和更高版本。

我的 api 低于 24 的安装 apk 的代码:

Intent intent = new Intent(Intent.ACTION_VIEW);
                            intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/icm/" + fileName)), "application/vnd.android.package-archive");
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            getActivity().startActivity(intent);

不适用于牛轧糖版本及更高版本的代码:

Intent intent = new Intent(Intent.ACTION_VIEW);
                                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                                Uri uri = FileProvider.getUriForFile(getContext(), getContext().getApplicationContext().getPackageName() + "clicksite.org.cafebazar.fileprovider", new File(Environment.getExternalStorageDirectory() + "/icm/" + fileName));
                                intent.setDataAndType(uri, "application/pdf");
                                getActivity().startActivity(intent);

android 清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="clicksite.org.cafebazar">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER"/>
            <action android:name="android.intent.action.MAIN"/>
        </intent-filter>
    </activity>
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>
</application>

和 provider_path.xml 位于 res 文件夹的 xml 目录中:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>

帮助我如何更改此代码以适用于牛轧糖版本和更高版本

问题 #1:权限错误

Uri uri = FileProvider.getUriForFile(getContext(), getContext().getApplicationContext().getPackageName() + "clicksite.org.cafebazar.fileprovider", new File(Environment.getExternalStorageDirectory() + "/icm/" + fileName));

这不匹配:

android:authorities="${applicationId}.provider"

将前面的行更改为:

Uri uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID + ".provider", new File(Environment.getExternalStorageDirectory(), "icm/" + fileName));

问题 #2:错误的 MIME 类型

intent.setDataAndType(uri, "application/pdf");

APK 文件不是 PDF 文件。将其更改为:

intent.setDataAndType(uri, "application/vnd.android.package-archive");

可能比这两个问题更多,因为你没有解释你的症状是什么。但是,这些肯定需要修复。我还建议 using ACTION_INSTALL_PACKAGE API 14 级及更高级别,而不是 ACTION_VIEW