name 파일 변환:Uri to File to Android




android uri to file name (12)

다음 코드에 의해, 어도비 애플리케이션이 스트림으로 PDF 파일을 공유하고 안드로이드 애플리케이션 경로에 저장하도록 할 수 있습니다.

Android.Net.Uri fileuri =
    (Android.Net.Uri)Intent.GetParcelableExtra(Intent.ExtraStream);

    fileuri i am getting as {content://com.adobe.reader.fileprovider/root_external/
                                        data/data/com.adobe.reader/files/Downloads/sample.pdf}

    string filePath = fileuri.Path;

   filePath I am gettings as root_external/data/data/com.adobe.reader/files/Download/sample.pdf

      using (var stream = ContentResolver.OpenInputStream(fileuri))
      {
       byte[] fileByteArray = ToByteArray(stream); //only once you can read bytes from stream second time onwards it has zero bytes

       string fileDestinationPath ="<path of your destination> "
       convertByteArrayToPDF(fileByteArray, fileDestinationPath);//here pdf copied to your destination path
       }
     public static byte[] ToByteArray(Stream stream)
        {
            var bytes = new List<byte>();

            int b;
            while ((b = stream.ReadByte()) != -1)
                bytes.Add((byte)b);

            return bytes.ToArray();
        }

      public static string convertByteArrayToPDF(byte[] pdfByteArray, string filePath)
        {

            try
            {
                Java.IO.File data = new Java.IO.File(filePath);
                Java.IO.OutputStream outPut = new Java.IO.FileOutputStream(data);
                outPut.Write(pdfByteArray);
                return data.AbsolutePath;

            }
            catch (System.Exception ex)
            {
                return string.Empty;
            }
        }

File 에서 android.net.Uri File 을 Android로 변환하는 가장 쉬운 방법은 무엇입니까?

다음을 시도했지만 작동하지 않습니다.

 final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
 Uri uri = Uri.fromFile(file);
 File auxFile = new File(uri.toString());
 assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());

Answer #1

파일 imageToUpload = 새 파일 (새 URI (androidURI.toString ())); 외부 저장소에서 만든 파일 인 경우 작동합니다.

예를 들어 file : /// storage / emulated / 0 / (일부 디렉토리 및 파일 이름)


Answer #2

네가 원하는 것은 ...

new File(uri.getPath());

... 그리고 ...

new File(uri.toString());

참고 : uri.toString()"file:///mnt/sdcard/myPicture.jpg" 형식의 문자열을 반환하지만 uri.getPath()"/mnt/sdcard/myPicture.jpg" 형식의 문자열을 반환합니다 "/mnt/sdcard/myPicture.jpg" .


Answer #3

Android + Kotlin

  1. Kotlin Android 확장 프로그램에 대한 종속성 추가 :

    implementation 'androidx.core:core-ktx:{latestVersion}'

  2. uri에서 파일 가져 오기 :

    uri.toFile()

Android + Java

그냥 위로 이동;)


Answer #4

오랜 시간을 검색 한 후 이것이 나를 위해 일한 것입니다.

File file = new File(getPath(uri));


public String getPath(Uri uri) 
    {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        if (cursor == null) return null;
        int column_index =             cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String s=cursor.getString(column_index);
        cursor.close();
        return s;
    }

Answer #5

나는 이것을 다음과 같이 만들었다.

try {
    readImageInformation(new File(contentUri.getPath()));

} catch (IOException e) {
    readImageInformation(new File(getRealPathFromURI(context,
                contentUri)));
}

public static String getRealPathFromURI(Context context, Uri contentUri) {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = context.getContentResolver().query(contentUri, proj,
                null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
}

그래서 기본적으로 먼저 카메라로 찍은 사진을 SD 카드에 저장 한 파일을 사용하려고합니다. 다음에 의해 반환 된 이미지에는 작동하지 않습니다. Intent photoPickerIntent = new Intent (Intent.ACTION_PICK); 이 경우 getRealPathFromURI() 함수를 사용하여 Uri를 실제 경로로 변환해야 할 필요가 있습니다. 결론은 Uri의 어떤 유형을 File로 변환 하느냐에 달려 있다는 것입니다.



Answer #7

이것들 중 어느 것도 나를 위해 일하지 않는다. 나는 이것이 이것이 작동하는 해결책이라는 것을 알았다. 하지만 제 경우는 이미지에만 국한됩니다 .

String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();

Answer #8

최상의 솔루션

하나의 간단한 FileUtil 자바 클래스 만들기 및 파일의 생성, 복사 및 이름 변경에 사용

uri.toString()uri.getPath() 있지만 작동하지 않습니다. 나는이 솔루션을 마침내 발견했다.

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileUtil {
    private static final int EOF = -1;
    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

    private FileUtil() {

    }

    public static File from(Context context, Uri uri) throws IOException {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        String fileName = getFileName(context, uri);
        String[] splitName = splitFileName(fileName);
        File tempFile = File.createTempFile(splitName[0], splitName[1]);
        tempFile = rename(tempFile, fileName);
        tempFile.deleteOnExit();
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(tempFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if (inputStream != null) {
            copy(inputStream, out);
            inputStream.close();
        }

        if (out != null) {
            out.close();
        }
        return tempFile;
    }

    private static String[] splitFileName(String fileName) {
        String name = fileName;
        String extension = "";
        int i = fileName.lastIndexOf(".");
        if (i != -1) {
            name = fileName.substring(0, i);
            extension = fileName.substring(i);
        }

        return new String[]{name, extension};
    }

    private static String getFileName(Context context, Uri uri) {
        String result = null;
        if (uri.getScheme().equals("content")) {
            Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
            try {
                if (cursor != null && cursor.moveToFirst()) {
                    result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
        }
        if (result == null) {
            result = uri.getPath();
            int cut = result.lastIndexOf(File.separator);
            if (cut != -1) {
                result = result.substring(cut + 1);
            }
        }
        return result;
    }

    private static File rename(File file, String newName) {
        File newFile = new File(file.getParent(), newName);
        if (!newFile.equals(file)) {
            if (newFile.exists() && newFile.delete()) {
                Log.d("FileUtil", "Delete old " + newName + " file");
            }
            if (file.renameTo(newFile)) {
                Log.d("FileUtil", "Rename file to " + newName);
            }
        }
        return newFile;
    }

    private static long copy(InputStream input, OutputStream output) throws IOException {
        long count = 0;
        int n;
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        while (EOF != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }
}

코드의 사용자 FileUtil 클래스

try {
         File file = FileUtil.from(MainActivity.this,fileUri);
         Log.d("file", "File...:::: uti - "+file .getPath()+" file -" + file + " : " + file .exists());

  } catch (IOException e) {
          e.printStackTrace();
  }

Answer #9

public String getRealPathFromURI (Uri uri) {

    String result;
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    if (cursor == null) {
        result = uri.getPath();
        cursor.close();
        return result;
    }
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    result = cursor.getString(idx);
    cursor.close();
    return result;
}

그런 다음 URI에서 파일을 가져 오는 데 사용 :

        File finalFile = newFile(getRealPathFromURI(uri));

- 너를 도와 줄 수있어 ----



Answer #11

@ CommonSWare는 모든 것을 아주 잘 설명했다. 그리고 우리는 그가 제안한 해결책을 정말로 사용해야합니다.

ContentResolver 질의 할 때 우리가 의지 할 수있는 정보 만이 여기에 언급 된 파일의 이름과 크기입니다 : File Information | Android 개발자

보시다시피, OpenableColumns 인터페이스에는 DISPLAY_NAME 및 SIZE의 두 필드 만 있습니다.

제 경우에는 JPEG 이미지에 대한 EXIF ​​정보를 검색하고 필요할 경우 서버로 보내기 전에 회전해야합니다. 이를 위해 ContentResolveropenInputStream() 사용하여 파일 내용을 임시 파일에 복사했습니다.





file-uri