问题描述
我在应用程序中具有导入和导出数据库文件的功能。我使用了mime类型的application/x-sqlite3
,它在较早的版本中运行良好。但是,在Android 11中,导出可以按预期工作,但是在选择导入时,复制的DB文件显示为灰色。因此,我无法选择文件进行进一步处理。如果我使用intent.setType("*/*");
,则可以访问该文件,但是我不想使每个文件都可选。我只想过滤出sqlite DB文件。
我也尝试过使用"application/vnd.sqlite3","application/octet-stream"
,但情况仍然存在。
这是代码段:
private void handleImportView() {
Intent intent = new Intent();
String[] mimetypes = {"application/x-sqlite3","application/vnd.sqlite3","application/octet-stream"};
intent.putExtra(Intent.EXTRA_MIME_TYPES,mimetypes);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select file to import"),REQUEST_CODE_RESTORE);
}
解决方法
现在解决了。
我正在使用以下代码创建要导出的文件:
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/x-sqlite3");
intent.putExtra(Intent.EXTRA_TITLE,filename);
startActivityForResult(intent,REQUEST_CODE_FILE_CREATED);
尽管已将"application/x-sqlite3"
指定为mime类型,但实际上它是使用mime application/x-trash
创建的文件。
我在onActivityResult中使用了intent.setType("*/*");
和getContentResolver().getType(uri);
来识别哑剧类型。
现在,我已经添加了这种mime类型,它可以按预期工作。
private void handleImportView() {
Intent intent = new Intent();
String[] mimetypes = {"application/x-sqlite3","application/vnd.sqlite3","application/octet-stream","application/x-trash"};
intent.putExtra(Intent.EXTRA_MIME_TYPES,mimetypes);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select file to import"),REQUEST_CODE_RESTORE);
}