3

私のイメージギャラリーのアプリケーションでは、リサイクラビューを拡張するためにメディアコンテンツプロバイダイメージを使用します。画像を長く押すと、その画像ファイルの名前を変更するユーザーオプションが与えられます。だから、私はリサイクラービューで各画像の完全なファイルパス(例: - /storage/sdcard1/DCIM/100ANDRO/ak.jpg)を持っています。次に、そのファイルの名前を変更します。ファイルをPATHからTreeUri(ストレージアクセスフレームワーク)に変換

提供されているファイルパスがExternal SD Cardのもので、Android 5の場合& upのため、ファイルを書き込むために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

複雑なファイルパス(SAFルートフォルダとしてLevel0を持つ/Level1/Level2/file.txtなど)については、正しいURIを取得できず、del /このようにファイルを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); 
     } 

    } 
} 

私の例では、私はあなたがJPGにPNGの名前を変更しようとする場合には問題がある可能性があるため、元のファイルのデフォルトの拡張子を維持検討することを忘れないでください。

+0

実際にonActivityResultデータは、SDカードのディレクトリ全体です。そして私はあなたがimage uriとしてdata.getData()を取っていると思います。 –

+0

私はあなたがこの問題を抱えていると思っています。http://zidroid.com/how-to-fix-extsdcard-mount-issue-on-kitkat-and-lollipop/ – Gorio

+0

いいえ、このリンクはルートデバイスについて語ります。 –

関連する問題