获取并保存使用 Intent.ACTION_GET_CONTENT 选择的任何文件
Get and save ANY file selected with Intent.ACTION_GET_CONTENT
我需要完成这些步骤:
- 让用户select一个文件(任何类型的文件)
- 获取永久引用以便稍后访问文件或复制到我的内部存储。
第一个真的很简单。我在使用 Intent.ACTION_GET_CONTENT 获取文件时没有任何问题。我也可以获得文件的 MimeType。但是我不能复制。
我尝试使用 FileInputStream 进行复制,但显然我没有权限。我真的希望有人能帮助我。
权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
意向调用
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
if ( intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_FILE_GET);
}
尝试复制文件失败
FileInputStream in = (FileInputStream) getContentResolver().openInputStream( data.getData());
FileOutputStream out = new FileOutputStream( "copy.jpg ");
FileChannel inChannel = in.getChannel();
FileChannel outChannel = out.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
in.close();
out.close();
错误:android.system.ErrnoException: open failed: EROFS (Read-only file system)
您正试图在根目录中创建输出流文件,/copy.jpg
,它是只读的。
使用 Environment methods, such as getExternalStorageDirectory()
, or one of the Context 方法之一,例如 getFilesDir()
,建立一个路径到您有写入权限的目录。
例如:
File outFile = new File(Environment.getExternalStorageDirectory(), "copy.jpg");
FileOutputStream out = new FileOutputStream(outFile);
此 documentation 描述了在内部或外部存储中存储文件的不同选项。
我需要完成这些步骤:
- 让用户select一个文件(任何类型的文件)
- 获取永久引用以便稍后访问文件或复制到我的内部存储。
第一个真的很简单。我在使用 Intent.ACTION_GET_CONTENT 获取文件时没有任何问题。我也可以获得文件的 MimeType。但是我不能复制。
我尝试使用 FileInputStream 进行复制,但显然我没有权限。我真的希望有人能帮助我。
权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
意向调用
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
if ( intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_FILE_GET);
}
尝试复制文件失败
FileInputStream in = (FileInputStream) getContentResolver().openInputStream( data.getData());
FileOutputStream out = new FileOutputStream( "copy.jpg ");
FileChannel inChannel = in.getChannel();
FileChannel outChannel = out.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
in.close();
out.close();
错误:android.system.ErrnoException: open failed: EROFS (Read-only file system)
您正试图在根目录中创建输出流文件,/copy.jpg
,它是只读的。
使用 Environment methods, such as getExternalStorageDirectory()
, or one of the Context 方法之一,例如 getFilesDir()
,建立一个路径到您有写入权限的目录。
例如:
File outFile = new File(Environment.getExternalStorageDirectory(), "copy.jpg");
FileOutputStream out = new FileOutputStream(outFile);
此 documentation 描述了在内部或外部存储中存储文件的不同选项。