3

イメージ ギャラリーのアプリケーションでは、メディア コンテンツ プロバイダーのイメージを使用して、リサイクラー ビューを膨らませます。画像を長押しすると、その画像ファイルの名前を変更するオプションをユーザーに提供します。したがって、リサイクラー ビューの各画像の完全なファイル パス (例:- /storage/sdcard1/DCIM/100ANDRO/ak.jpg ) があります。次に、そのファイルの名前を変更したいと思います。

ここでの問題は、提供されるファイル パスが外部 SD カードのパスであるため、Android 5 以降の場合、ファイルを書き込むために 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 がわかっている場合です。ここで私の場合、ファイルパスを知っているので、それを TreeUri に変換したいと考えています。

4

4 に答える 4

6

ファイル パスを uri に変換するには、次を使用します。

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

次に、この fileuri に対して削除、名前変更操作を実行できます。

于 2016-05-04T06:00:23.250 に答える
1

ACTION_OPEN_DOCUMENT_TREE または ACTION_OPEN_DOCUMENT を使用して Uri を取得したくない場合は、API19 (Android4.4-Kitkat) から API28 (Android8-Oreo) まで有効な次の方法を使用して、FILE を Uri (SAF) に変換できます。返される Uri は、ダイアログを返すものと同じであり、アプリケーション外の外部リムーバブル ストレージにアクセスする場合は、API 28 セキュリティ制限 (SAF アクセス許可) に対して有効です...

 /**
 * Ing.N.Nyerges 2019 V2.0
 *
 * Storage Access Framework(SAF) Uri's creator from File (java.IO),
 * for removable external storages
 *
 * @param context Application Context
 * @param file File path + file name
 * @return Uri[]:
 *   uri[0] = SAF TREE Uri
 *   uri[1] = SAF DOCUMENT Uri
 */
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static Uri[] getSafUris (Context context, File file) {

    Uri[] uri = new Uri[2];
    String scheme = "content";
    String authority = "com.android.externalstorage.documents";

    // Separate each element of the File path
    // File format: "/storage/XXXX-XXXX/sub-folder1/sub-folder2..../filename"
    // (XXXX-XXXX is external removable number
    String[] ele = file.getPath().split(File.separator);
    //  ele[0] = not used (empty)
    //  ele[1] = not used (storage name)
    //  ele[2] = storage number
    //  ele[3 to (n-1)] = folders
    //  ele[n] = file name

    // Construct folders strings using SAF format
    StringBuilder folders = new StringBuilder();
    if (ele.length > 4) {
        folders.append(ele[3]);
        for (int i = 4; i < ele.length - 1; ++i) folders.append("%2F").append(ele[i]);
    }

    String common = ele[2] + "%3A" + folders.toString();

    // Construct TREE Uri
    Uri.Builder builder = new Uri.Builder();
    builder.scheme(scheme);
    builder.authority(authority);
    builder.encodedPath("/tree/" + common);
    uri[0] = builder.build();

    // Construct DOCUMENT Uri
    builder = new Uri.Builder();
    builder.scheme(scheme);
    builder.authority(authority);
    if (ele.length > 4) common = common + "%2F";
    builder.encodedPath("/document/" + common + file.getName());
    uri[1] = builder.build();

    return uri;
}
于 2019-07-15T22:54:57.607 に答える
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 に名前変更しようとすると問題が発生する可能性があるためです。

于 2016-04-29T16:21:49.453 に答える