Adobe AIR + Android File.applicationStorageDirectory 的文件提供程序 FILE_PROVIDER_PATHS
Adobe AIR + Android Fileprovider FILE_PROVIDER_PATHS for File.applicationStorageDirectory
我正在尝试更新 ANE(Adobe 本机扩展)以在 Android 上与我的 Adobe AIR 应用程序一起使用,但我似乎无法获得正确的 FILE_PROVIDER_PATHS 文件.
我将文件下载到我的 Adobe 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/data/air.[=46 中称为“/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 中为其设置路径
感谢您的宝贵时间!
呸,我试了很多次,但我终于弄明白了。虽然解决方案很接近。
所以当我们像这样在 Flex/AIR 中创建文件时
_updateDirectory = File.applicationStorageDirectory;
_updateFile = _updateDirectory.resolvePath("myFileName.apk");
Android设备上的原生路径指向这个位置(可以在_updateFile.nativePath下的Flex中调试)
/data/user/0/air.MY_APP_ID_HERE/MY_APP_ID_HERE/Local Store/myFileName.apk
在fileproviderpaths.xml中需要指定file-path,其他两个不需要。但是这个
<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”应该叫同一个名字,并且确保在你的实际应用程序 ID 之前添加 "air.",因为这就是你的应用程序将如何安装设备 - "air.YOU_APP_ID_HERE"
我正在尝试更新 ANE(Adobe 本机扩展)以在 Android 上与我的 Adobe AIR 应用程序一起使用,但我似乎无法获得正确的 FILE_PROVIDER_PATHS 文件.
我将文件下载到我的 Adobe 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/data/air.[=46 中称为“/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 中为其设置路径
感谢您的宝贵时间!
呸,我试了很多次,但我终于弄明白了。虽然解决方案很接近。
所以当我们像这样在 Flex/AIR 中创建文件时
_updateDirectory = File.applicationStorageDirectory;
_updateFile = _updateDirectory.resolvePath("myFileName.apk");
Android设备上的原生路径指向这个位置(可以在_updateFile.nativePath下的Flex中调试)
/data/user/0/air.MY_APP_ID_HERE/MY_APP_ID_HERE/Local Store/myFileName.apk
在fileproviderpaths.xml中需要指定file-path,其他两个不需要。但是这个
<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”应该叫同一个名字,并且确保在你的实际应用程序 ID 之前添加 "air.",因为这就是你的应用程序将如何安装设备 - "air.YOU_APP_ID_HERE"