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

不,这个链接谈论根植设备。 –