大家都知道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我的QQ121513057有什么不懂的欢迎提问.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(); }