【问题标题】:Open APK file from application on API 24 and above从 API 24 及更高版本的应用程序打开 APK 文件
【发布时间】:2020-02-12 19:15:30
【问题描述】:

我需要使用从远程主机下载的 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 构建系统。

【问题讨论】:

  • 我能够添加 androidx.core.content 支持,最后安装了 apk。我会尽快描述一切。

标签: android gradle android-fileprovider fileprovider


【解决方案1】:

要解决该问题,请在 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.gradledependencies

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2019-01-10
    • 1970-01-01
    相关资源
    最近更新 更多