我正在尝试为我的应用程序实现文档提供程序扩展,以允许在应用程序之间导入/导出/移动文件.
我创建了我的主应用程序并将文档提供程序和文件提供程序扩展添加到项目中,检查它们是否构成了每个目标功能中相同应用程序组标识符的一部分.
文档提供程序目标的信息plist具有以下设置:
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>UIDocumentPickerModes</key>
<array>
<string>UIDocumentPickerModeImport</string>
<string>UIDocumentPickerModeExportToService</string>
<string>UIDocumentPickerModeMoveToService</string>
</array>
<key>UIDocumentPickerSupportedFileTypes</key>
<array>
<string>public.content</string>
</array>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>Main</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.fileprovider-ui</string>
</dict>
Run Code Online (Sandbox Code Playgroud)
虽然文件提供程序的info.plist具有以下内容:
<dict>
<key>NSExtensionFileProviderDocumentGroup</key>
<string>group.com.myAppGroupId</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.fileprovider-nonui</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).FileProvider</string>
</dict>
Run Code Online (Sandbox Code Playgroud)
我正在使用UIDocumentPickerExtensionViewController子类和创建目标时生成的NSFileProviderExtension子类的默认实现,并且我在每个方法中都设置了断点来测试它们是否正确运行.
但是当我尝试运行文档提供程序时,我无法将应用程序显示在可用于共享文档的应用程序列表中.我用我的设备和模拟器测试了这个,选择iPhoto和Pages作为主机应用.
我在这里错过了什么吗?
我不知道为什么会发生这种情况,但是我无法从Google相册提供者中选择图片。在API 27上进行测试。
如果我使用:
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
Run Code Online (Sandbox Code Playgroud)
当我打开“照片”提供程序并浏览文件夹时,会看到很多这样的文件:
2019-03-02 12:04:15.164 17641-13395/? W/NetworkManagementSocketTagger: untagSocket(120) failed with errno -22
2019-03-02 12:04:22.528 13217-13217/? E/ResourceType: Style contains key with bad entry: 0x01010586
2019-03-02 12:04:22.535 13217-13217/? W/ResourceType: For resource 0x7f020366, entry index(870) is beyond type entryCount(468)
Run Code Online (Sandbox Code Playgroud)
当我单击图片时,我看到以下内容:
2019-03-02 12:04:34.150 13217-13217/? W/ResourceType: For resource 0x7f02036c, entry index(876) is beyond type entryCount(468)
2019-03-02 12:04:34.151 13217-13217/? W/ResourceType: For resource 0x7f02036c, entry index(876) is beyond type entryCount(468)
2019-03-02 12:04:34.229 2907-16891/? W/MediaExtractor: …
Run Code Online (Sandbox Code Playgroud) android android-intent kotlin google-photos document-provider
我正在学习更多关于ios扩展的知识,例如:
在所有这些中,我没有学习上的困难,但最近我尝试学习"文档提供者扩展",并且令我惊讶的是,没有在互联网上找到任何关于如何使用它的相关教程(与其他人一样一步一步) ).
我找到的唯一选择是使用文档,我了解到他可以从其他应用程序访问共享文档,您还可以在应用程序中共享自己的现有文档.
我在网上找到的唯一一个教程是MacStories网站,但他使用的是iCloud,而且这次我不想使用iCloud,我想要做文档说:
允许其他应用访问您应用管理的文档(不使用iCloud)
在我的情况下,我已经知道"提供者文档扩展"是如何工作的,因此设法创建一个新的目标类型"文档提供者扩展",并且只有这一点.有谁知道这个扩展如何工作?
更新:我最初的问题可能具有误导性,所以我想重新表述它:我想通过 Android 的存储访问框架从 MTP 连接的设备遍历层次树。我似乎无法实现这一点,因为我得到一个SecurityException
声明,即子节点不是其父节点的后代。有没有办法解决这个问题?或者这是一个已知问题?谢谢。
我正在编写一个 Android 应用程序,该应用程序尝试使用 Android 的存储访问框架 (SAF) 通过MtpDocumentsProvider
. 我或多或少遵循https://github.com/googlesamples/android-DirectorySelection 中描述的代码示例,了解如何从我的应用程序启动 SAF Picker,选择 MTP 数据源,然后在onActivityResult
中使用返回Uri
的遍历层次结构。不幸的是,这似乎不起作用,因为一旦我访问一个子文件夹并尝试遍历它,我总是得到一个SecurityException
说明document xx is not a descendant of yy
所以我的问题是,使用MtpDocumentProvider
,如何从我的应用程序成功遍历层次结构树并避免此异常?
具体来说,在我的应用程序中,我首先调用以下方法来启动 SAF Picker:
private void launchStoragePicker() {
Intent browseIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
browseIntent.addFlags(
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
| Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
);
startActivityForResult(browseIntent, REQUEST_CODE_OPEN_DIRECTORY);
}
Run Code Online (Sandbox Code Playgroud)
然后 Android SAF 选择器启动,我看到我连接的设备被识别为 MTP 数据源。我选择了上述数据源,然后Uri
从我的onActivityResult
:
@Override
public void onActivityResult(int requestCode, …
Run Code Online (Sandbox Code Playgroud) android mtp android-external-storage storage-access-framework document-provider
我正在使用新的文档提供程序功能来尝试将文件导出到第三方云服务:
UIDocumentMenuViewController* activity = [[UIDocumentMenuViewController alloc] initWithURL:writer.file
inMode:UIDocumentPickerModeExportToService];
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我会看到iCloud,Google Drive和Dropbox作为一个选项(它们似乎可以工作).即使我安装了应用程序,我看不到的是Box.
更重要的是奇怪的是,当我使用UIDocumentPickerModeOpen
,箱体没有出现,随着iCloud的一起,但Dropbox和谷歌Drive都不见了.但是,我不能从任何一个提供商打开文件; 它不会让我选择我的自定义文档类型.在我刚刚导出CSV文件的另一个应用程序似乎没有问题到所有提供商.
该文件使用自定义文件类型,我猜这是问题的一部分.此处还有其他问题,我相信我已按照说明正确操作.
添加自定义文件类型时是否错过了一个步骤?创建文档菜单时还有其他选项吗?文档提供程序中是否存在错误?(我注意到它适用于iCloud Drive的所有情况.)
在尝试为个人资料图片选择图片时,我仅在某些设备中发现了此问题。在模拟器中签入时,这些问题没有出现,但在应用程序的实时版本中,此用户面临此问题。从Firebase崩溃报告中捕获的屏幕截图。请帮助我找出问题所在。
AndroidMenifest.xml
...
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
...
Run Code Online (Sandbox Code Playgroud)
SomeActivity.java
private void pickProfilePictureTask() {
Intent intent = null;
if (Build.VERSION.SDK_INT > 19) {
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.addCategory(Intent.CATEGORY_OPENABLE);
} else {
intent = new Intent(Intent.ACTION_GET_CONTENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICKER_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMAGE_PICKER_REQUEST && resultCode == Activity.RESULT_OK) {
if (data != null) {
/**Getting bitmap
*
* InputStream …
Run Code Online (Sandbox Code Playgroud) android file-permissions android-manifest android-permissions document-provider
我正在应用程序中选择照片,我已经习惯UIDocumentMenuViewController
显示文档提供程序的扩展名列表.此列表显示Dropbox,iCloud,GoogleDrive但不是原生照片应用,为什么?我的代码示例:
UIDocumentMenuViewController *menuVC = [[UIDocumentMenuViewController alloc] initWithDocumentTypes:@[@"public.image"] inMode:UIDocumentPickerModeImport];
Run Code Online (Sandbox Code Playgroud)