我试图在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?
答案 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