3

在我的圖像庫應用程序中,我使用媒體內容提供程序圖像來充實回收站視圖。長按一個圖像,我讓用戶選擇重命名該圖像文件。因此,我在回收視圖中爲每個圖像都有完整的文件路徑(例如: - /storage/sdcard1/DCIM/100ANDRO/ak.jpg)。然後我想重命名該文件。將文件路徑轉換爲TreeUri(存儲訪問框架)

現在的問題是,由於提供的文件路徑是外部SD卡的文件路徑,所以需要SAF(存儲訪問框架)來編寫文件。

所以一般我們使用此代碼爲重命名使用SAF文件: -

public void onActivityResult(int requestCode, int resultCode, Intent resultData){ 
    if (resultCode == RESULT_OK) { 
     Uri treeUri = resultData.getData(); 
     getContentResolver().takePersistableUriPermission(treeUri, 
       Intent.FLAG_GRANT_READ_URI_PERMISSION | 
         Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri); 
     DocumentFile newFIle = pickedDir.createFile("text/plain","MyFile") 
     // or rename as 
     pickedDir.renameTo("fdtd.jpg"); 
    } else { 
     Log.d("test","NOt OK RESULT"); 
    } 
} 

但事實的情況下,當我們知道TreeUri。在我的情況下,我知道fle路徑,因此想將其轉換爲TreeUri。

+0

更改您的應用程序以允許用戶通過「ACTION_OPEN_DOCUMENT」或「ACTION_OPEN_DOCUMENT_TREE」選擇文件。沒有從存儲提供者的路徑轉換爲'Uri'。 – CommonsWare

+0

不,實際上這對於我正在開發的應用程序的類型來說是不可能的 –

回答

4

要文件路徑轉換爲URI使用本: -

DocumentFile fileuri = DocumentFile.fromFile(new File(filepath)); 

然後你就可以進行刪除,在此fileURI所重命名操作。

+0

對於複雜的文件路徑(例如Level0作爲SAF根文件夾的/Level1/Level2/file.txt),我無法檢索到正確的uri並且無法刪除/ ren文件這種方式。據我所知,我必須走過每個級別,直到我到達文件,然後我可以刪除或重命名它。 –

0

您必須在renameTo方法中設置完整路徑。

用我的例子工作。

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

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
     Uri selectedImage = data.getData(); 
     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

     Cursor cursor = getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 

     if (cursor != null) { 
      cursor.moveToFirst(); 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String picturePath = cursor.getString(columnIndex); 
      cursor.close(); 

      ImageView imageView = (ImageView) findViewById(R.id.image); 
      imageView.setOnClickListener(this); 

      Bitmap bmp = null; 
      try { 
       bmp = getBitmapFromUri(selectedImage); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      imageView.setImageBitmap(bmp); 

      //get file 
      File photo = new File(picturePath); 

      //file name 
      String fileName = photo.getName(); 

      //resave file with new name 
      File newFile = new File(photo.getParent() + "/fdtd." + fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length())); 

      photo.renameTo(newFile); 
     } 

    } 
} 

請記住,在我的例子中,我考慮維護原始文件的默認擴展名,因爲如果您嘗試將PNG重命名爲JPG,您可能會遇到問題。

+0

其實onActivityResult數據是整個SD卡目錄uri。我認爲你正在將data.getData()作爲圖像的URI。 –

+0

我想你有這個問題.. http://zidroid.com/how-to-fix-extsdcard-mount-issue-on-kitkat-and-lollipop/ – Gorio

+0

不,這個鏈接談論根植設備。 –