【问题标题】:Adobe AIR + Android Fileprovider FILE_PROVIDER_PATHS for File.applicationStorageDirectoryAdobe AIR + Android Fileprovider FILE_PROVIDER_PATHS for File.applicationStorageDirectory
【发布时间】:2020-02-06 18:39:04
【问题描述】:

我正在尝试更新 ANE(Adobe 原生扩展)以在 Android 上使用我的 Adob​​e AIR 应用程序,但我似乎无法为文件获取正确的 FILE_PROVIDER_PATHS。

我将文件下载到我的 Adob​​e Flex 应用程序中的应用程序的 File.applicationStorageDirectory。

我在 Android 清单中的 FileProvider 如下所示:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="air.MY_APP_ID_HERE.files"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/fileproviderpaths" />
</provider>

fileproviderpaths.xml:

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

然后在 ANE (Java) 代码中,我尝试像这样访问文件:

newFile = new File(urlString); 

// newFile.getPath() debugs as "/data/user/0/air.MY_APP_ID_HERE/MY_APP_ID_HERE/LocalStore/myFileName.apk"
// the file really exists there - i see it on newFile.exists() and newFile.length()

// context.getActivity() just returns the Android Context - this is Adobe AIR specific
// context.getActivity().getPackageName() debugs as "air.MY_APP_ID_HERE"

Uri fileUri = FileProvider.getUriForFile(context.getActivity(), context.getActivity().getPackageName() + ".files", newFile);

无论我在 fileproviderpaths.xml 中尝试什么,我总是遇到异常

Failed to find configured root that contains /data/data/air.MYAPP_ID_HERE/MYAPP_ID_HERE/Local Store/myFileName.apk

现在我的主要问题是为什么它在 newFile.getPath() 中称为“/data/user/0/air.MY_APP_ID_HERE...”,而在FileProvider 异常?

第二个问题是如何使用 Fileprovider 到达“/data/user/0/air.MY_APP_ID_HERE/MY_APP_ID_HERE/LocalStore/myFileName.apk”或如何在 fileproviderpaths.xml 中为其设置路径

感谢您的宝贵时间!

【问题讨论】:

  • newFile = new File(urlString); 那么 urlString 的值是多少?你应该从那开始。请编辑您的代码。
  • fileUri.toSTring() 的值是多少?
  • "/data/user/0/air.MY_APP_ID_HERE/MY_APP_ID_HERE/LocalStore/myFileName.apk"。我认为目录/data/user/0/air.MY_APP_ID_HERE 将不存在。但我不知道空气。目录 /data/user/0/MY_APP_ID_HERE 可能存在。那将是您的应用程序私有内部存储器。
  • FileProvider 需要 getFilesDir() 或其子目录中的文件。 getFilesDir().getAbsolutePath() 的值是多少?
  • &lt;files-path name="files" path="." /&gt; &lt;external-path name="files" path="." /&gt; &lt;external-files-path name="files" path="." /&gt; 我不会给他们三个名字files

标签: android apache-flex air android-fileprovider ane


【解决方案1】:

唷,经过多次试验和错误,我终于弄明白了。虽然解决方案很接近。

所以当我们像这样在 Flex/AIR 中创建文件时

_updateDirectory = File.applicationStorageDirectory;
_updateFile = _updateDirectory.resolvePath("myFileName.apk");

Android 设备上的原生路径指向这个位置(可以在 Flex 中的 _updateFile.nativePath 下调试)

/data/user/0/air.MY_APP_ID_HERE/MY_APP_ID_HERE/Local Store/myFileName.apk

在fileproviderpaths.xml 中你需要指定文件路径,其他两个不是必须的。但是这个

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

指向设备上的这个目录:

/data/user/0/air.MY_APP_ID_HERE/files

所以我们需要做的是将一个目录向上移动到根目录,然后向下移动到我们的 AIR applicationStorageDirectory:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="somenamehere" path="../MY_APP_ID_HERE/Local Store" />
</paths>

然后您可以将该文件传递给 Java ANE(在我的情况下,我已经在 Flex 中下载了该文件并希望让 ANE 安装它):

AppInstaller.getInstance().installApp(_updateFile.nativePath);

Java ANE 代码:

urlString = Uri.parse(args[0].getAsString()).toString(); 
newFile = new File(urlString);
Uri fileUri = FileProvider.getUriForFile(context.getActivity(), context.getActivity().getPackageName() + ".files", newFile);

这里的+“.files”部分是指manifest中的fileprovider声明

android:authorities="air.MY_APP_ID_HERE.files"

所以这里的“.files”和那里的“.files”应该被称为相同的,并且确保你添加了“air”。在您的实际应用 ID 之前,因为这就是您的应用在设备上的安装方式 - 作为“air.YOU_APP_ID_HERE”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2013-05-04
    相关资源
    最近更新 更多