3

В моем приложении галереи изображений я использую изображение поставщика медиаконтента, чтобы раздуть просмотр ресайклера. При длительном нажатии на изображение я предоставляю пользователю возможность переименовать этот файл изображения. Таким образом, у меня есть полный путь к файлу (Ex: - /storage/sdcard1/DCIM/100ANDRO/ak.jpg) для каждого изображения в режиме просмотра вторсырья. Затем я хочу переименовать этот файл.Преобразование файла PATH в TreeUri (Storage Access Framework)

Теперь проблема заключается в том, что в качестве пути к файлу предусмотрена внешняя SD-карта, а для Android 5 & up, SAF (Storage Access Framework) требуется для записи файла.

Так обычно мы используем этот код для переименования файла с помощью 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

Чтобы преобразовать путь к файлу в Ури использования этого: -

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

Затем можно выполнить удаление, переименование операций на этом fileuri.

+0

Для сложных путей к файлам (например, /Level1/Level2/file.txt с Level0 в качестве корневой папки SAF) я не смог получить правильный uri и не смог del/ren file this way. Как я знаю, я должен пройти каждый уровень до тех пор, пока не дойду до файла, только тогда я смогу удалить или переименовать его. –

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 card uri. И я думаю, что вы берете data.getData() как изображение uri. –

+0

Я думаю, что у вас есть эта проблема. Http://zidroid.com/how-to-fix-extsdcard-mount-issue-on-kitkat-and-lollipop/ – Gorio

+0

Нет, эта ссылка рассказывает о корневом устройстве. –

 Смежные вопросы

  • Нет связанных вопросов^_^