android - 从API 24以上版本的应用程序打开APK文件

标签 android gradle android-fileprovider fileprovider

我需要打开从远程主机下载的apk文件的意图。在低于24的API上,一切正常,但似乎还可以。现在,我必须定位到API 29,这会导致我遇到一些问题。

当我尝试在装有Android 10的设备上打开apk文件时,我从日志中得到的所有内容都是:

Caught Exception: file:///storage/emulated/0/Download/blablabla.apk exposed beyond app through Intent.getData()

我尝试按照此处的建议添加 FileProvider
https://stackoverflow.com/a/38858040/717599
还是这里
https://infinum.com/the-capsized-eight/share-files-using-fileprovider

但由于无法定义此类,因此我无法使用或导入 FileProvider 。我尝试过了
import android.support.v4.content.FileProvider

但是在任何地方都找不到软件包。
然后,我修改了AndroidManifest.xml,使其包含
<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"/>

但这不能神奇地解决问题。

我什至尝试禁用运行时检查,如此处所述:
https://stackoverflow.com/a/42437379/717599

但是仍然没有成功:
Caught Exception: No Activity found to handle Intent { act=android.intent.action.VIEW 
dat=file:///storage/emulated/0/Download/blablabla.apk typ=application/vnd.android.package-archive flg=0x10000001 }

除了降级API 24以下的所有内容之外,我不知道下一步该做什么或尝试做什么,这是我不能做的。有人可以指出我该怎么办,或者在哪里可以找到任何可行的例子?如果需要任何其他信息,或者甚至(不)需要演示,我将很乐意提供。

我正在使用从QtCreator运行的gradle构建系统。

最佳答案

要解决该问题,请在 AndroidManifest.xml 的“应用程序”部分中添加以下内容

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS\"
                android:resource="@xml/provider_paths" />
        </provider>

我还在 resources / xml 目录中创建了xml文件,其内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_download" path="Download"/>
</paths>

然后到 build.gradle 依赖项
compile "com.android.support:support-v4:25.0.+"

创建文件 gradle.properties (在我的情况下,它不是由QtCreator创建的)。这是我所缺少的部分-粘贴此:
android.enableJetifier=true
android.useAndroidX=true 

在java文件中,我们现在可以
import androidx.core.content.FileProvider;

public static void installPackage(String packageLocation){
Uri uriForFile = FileProvider.getUriForFile(
    context, context.getPackageName() + ".fileprovider", new File(packageLocation));
// handle both cases differently - already done in quoted examples
}

关于android - 从API 24以上版本的应用程序打开APK文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60195416/

相关文章:

android - 水平格子线android textview

gradle - 如果gradle/ivy已经在我的Maven本地仓库中显示了依赖项,为什么不下载依赖项呢?

elasticsearch - 如何使用build.gradle为您的测试设置Elasticsearch

Android FileProvider 导致相机/图库随机崩溃

android - 错误找不到符号变量 FileProvider 包 android.support.v4.content 不存在

android - java.io.FileNotFoundException : fileprovider 错误

android - 设置相机拍摄图像的分辨率

java - 没有这样的表(代码 1)

java - 二进制 XML 文件行 #12 : Error inflating class com. android.phone91.DialPadView

java - Jackson lib gradle 的 Eclipse 类路径问题