关于Android5.0SD卡读写的问题

来源:互联网 发布:淘宝月销量每月清零么 编辑:程序博客网 时间:2024/05/19 17:04

大家都知道Android5.0对SD卡进行了安全性的升级,再也不能按照传统的方式进行SD卡的读写.

下文详细介绍Android在5.0读写的流程.

第一步,首先需要获得SD卡的权限,要跳转到系统选择SD卡的界面,如果目录获得了权限,那么子目录也获得了权限.这个权限是递归的.

/** * 获得SD卡的权限 */private void performDirectoryChoose() {    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);    //intent.setFlags(Intent.EXTRA_ALLOW_MULTIPLE);    startActivityForResult(intent, DIRECTORY_CHOOSE_REQ_CODE);}
跳转之后我们选择SD卡的根目录.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (resultCode == RESULT_OK) {        Log.d(TAG, "result back");        Uri treeUri = data.getData();        getContentResolver().takePersistableUriPermission(treeUri,                Intent.FLAG_GRANT_READ_URI_PERMISSION |                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//把SD卡的权限保存        Log.d(TAG, "Uri: " + treeUri.toString());               //否则重启设备权限        saveUriName(treeUri.toString());                        //需要再次申请        //for directory choose        mPickedDir = DocumentFile.fromTreeUri(this, treeUri);    }}
第二步,获取文件或者文件夹的URI

因为SD对文件的操作是根据DocumentFile来操作的,而获得DocumentFile需要URI,所以我们得获得文件或者文件夹的URI才能进行文件的各种操作.

我们访问SD卡目录下的Android/data 发现他的URI为

content://com.android.externalstorage.documents/tree/C4B8-C809%3AAndroid/document/C4B8-C809%3AAndroid%2Fdata
而Uri treeUri = data.getData();  uri.ToString()等于ontent://com.android.externalstorage.documents/tree/C4B8-C809%3A

所以根据规律来获取URI就非常简单了,我自己写了一个方法,但是只能获得最多相对SD卡二级目录的URI.因为懒得弄了.想弄更多级别的目录的可以自己拼接uri

 /**  * @param path 相对SD卡的位置  * @return  */public static String PathToUri(String path,Context mContext){    Log.d("DocumentFileUtils", path+"length="+path.split("/").length);    if(path.split("/").length<=1){        return getUriName(mContext)+path;    }if(path.split("/").length>1){        return getUriName(mContext)+path.split("/")[0]+"/document/"+getUriName(mContext).split("tree/")[1]+path.split("/")[0]+"%2F"+path.split("/")[1];    }    return "content://com.android.externalstorage.documents/tree/C4B8-C809%3AAndroid/document/C4B8-C809%3AAndroid%2Fdata";}
获得了uri就可以进行文件的创建删除等操作了,创建和删除的代码为

DocumentFile.fromTreeUri(this,uri).createDirectory("sa");
DocumentsContract.deleteDocument(getContentResolver(), uri);

写的代码为

public static void writeTextFromUri(Uri uri,ArrayList<String> mTexts,Context  mContext) throws IOException {    OutputStream outputStream = mContext.getContentResolver().openOutputStream(uri);    BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(outputStream));    for (String mText : mTexts) {        bufferedWriter.write(mText+"\t\n");    }    bufferedWriter.close();    outputStream.close();}
我的QQ121513057有什么不懂的欢迎提问.

1 0
原创粉丝点击