如何使用Scoped Directory Access权限系统读取文件?

时间:2018-05-01 20:52:34

标签: java android file

我试图在Android 7.0(三星S7)上访问我的SD卡,我发现这是获得许可的可能方式:https://developer.android.com/training/articles/scoped-directory-access

我写了以下代码

public class MainActivity extends AppCompatActivity {

    Intent sdCardIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
        StorageVolume sdCARD = null;
        for (StorageVolume volume : sm.getStorageVolumes()) {
            if (volume.getDescription(this.getApplicationContext()).equals("SD card")) {
                sdCARD = volume;
            }
        }
        if (sdCARD == null) {
            return;
        }
        sdCardIntent = sdCARD.createAccessIntent(null);
        startActivityForResult(sdCardIntent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Access sd card?
    }
}

运行时,我得到了权限提示,它似乎工作,因为我在onActivityResult中获取了该事件,但我还没有找到如何访问SD卡上的任何文件或目录。

我是否必须使用从Intent结果中获得的URI?

1 个答案:

答案 0 :(得分:1)

  

我是否必须使用从Intent结果中获得的URI?

是。 Uri应该代表文档树,因此您可以使用DocumentFile.fromTreeUri()在该树上获取DocumentFile。从那里,您可以迭代内容并将Uri个对象添加到各个内容中。使用ContentResolver及其openInputStream()方法读取任何此类内容。

然而:

  • 请在后台主题上执行I / O

  • 如果您希望将Uri传递给其他组件(例如,活动,服务),即使在您自己的应用中,请确保包含FLAG_GRANT_READ_URI_PERMISSION和/或{{1}到你的FLAG_GRANT_WRITE_URI_PERMISSION