无法从assets文件夹安装apk

时间:2018-05-16 13:11:43

标签: android android-intent android-install-apk

在我的资源文件夹中,我有一个apk文件,我的目标是在按钮click.I写一个函数,可以读取apk并生成文件,无法安装它。这是我的功能

<?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <system.webServer>        
      <handlers>

        <add name="iisnode" path="app.js" verb="*" modules="iisnode"/>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </handlers>

      <rewrite>

        <rules>

            <rule name="DynamicContent">

                 <match url="/*" />

                 <action type="Rewrite" url="app.js"/>
            </rule>
       </rules>
      </rewrite>
    </system.webServer>
  </configuration>

我这样称呼这个函数

private File prepareApk(String assetName) {
    byte[] buffer = new byte[8192];
    InputStream is = null;
    FileOutputStream fout = null;
    try {
        is = getAssets().open(assetName);
        fout = openFileOutput("tmp.apk", Context.MODE_PRIVATE);
        int n;
        while ((n=is.read(buffer)) >= 0) {
            fout.write(buffer, 0, n);
        }
    } catch (IOException e) {
        Log.i("InstallApk", "Failed transferring", e);
    } finally {
        try {
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            if (fout != null) {
                fout.close();
            }
        } catch (IOException e) {
        }
    }

    return getFileStreamPath("tmp.apk");
}

没有例外,没有警告,只是无法安装它。这是我的gradle文件源

 Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
 intent.setData(Uri.fromFile(prepareApk("myapk.apk")));
 startActivity(intent);

} 我怎么能解决我的问题?感谢

1 个答案:

答案 0 :(得分:0)

其他应用 - 包括安装程序 - 无权访问您应用的内部存储空间。此外,在Android 7.0及更高版本中,您将使用FileUriExposedException崩溃。

在Android 7.0及更高版本中,您需要使用FileProvider来提供该文件,FileProvider.getUriForFile()Uri放入Intent

在Android 6.0及更早版本中,您必须将文件保存到外部存储空间(例如getExternalCacheDir())。