获取并保存使用Intent.ACTION_GET_CONTENT选择的任何文件

时间:2015-06-27 06:16:49

标签: android android-intent io android-fileprovider

我需要完成以下步骤:

  1. 让用户选择一个文件(任何类型的文件)
  2. 获取永久性引用以便稍后访问该文件或复制到我的内部存储。
  3. 第一个真的很容易。使用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)

1 个答案:

答案 0 :(得分:3)

您正在尝试在根目录tcrossprod(table(df))*!diag(3) # Products #Products Product a Product b Product c # Product a 0 2 1 # Product b 2 0 1 # Product c 1 1 0 中创建输出流文件,该目录是只读的。

使用其中一种Environment方法(例如/copy.jpg)或Context方法之一(例如getExternalStorageDirectory())来构建您编写的目录的路径访问。

例如:

getFilesDir()

documentation描述了在内部或外部存储中存储文件的不同选项。