首页 文章

将文件:Uri转换为Android中的文件

提问于
浏览
308

什么是在Android中从 file: android.net.Uri 转换为 File 的最简单方法?

尝试以下但它不起作用:

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());

16 回答

  • -1

    使用

    InputStream inputStream = getContentResolver().openInputStream(uri);
    

    直接复制文件 . 另见:

    https://developer.android.com/guide/topics/providers/document-provider.html

  • 33

    使用Kotlin它更容易:

    val file = File(uri.path)
    

    或者,如果您使用Kotlin extensions for Android

    val file = uri.toFile()
    
  • -1

    Android + Kotlin

    • 为Kotlin Android扩展添加依赖项:

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

    • 从uri获取文件:

    uri.toFile()

    Android + Java

    刚刚移到顶部;)

  • 646

    你想要的是......

    new File(uri.getPath());
    

    ... 并不是...

    new File(uri.toString());
    

    NOTE: uri.toString() 返回格式为: "file:///mnt/sdcard/myPicture.jpg" 的字符串,而 uri.getPath() 返回格式为: "/mnt/sdcard/myPicture.jpg" 的字符串 .

  • 3

    搜索了很长时间后,这对我有用:

    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;
        }
    
  • -1

    编辑:对不起,我之前应该测试得更好 . 这应该工作:

    new File(new URI(androidURI.toString()));
    

    URI是java.net.URI .

  • 1

    这些都不适合我 . 我发现这是一个有效的解决方案 . But my case is specific to images .

    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();
    
  • 0

    Best Solution

    Create one simple FileUtil java class & use to creat, copy and rename the file

    我使用 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;
        }
    }
    

    User FileUtil class in your code

    try {
             File file = FileUtil.from(MainActivity.this,fileUri);
             Log.d("file", "File...:::: uti - "+file .getPath()+" file -" + file + " : " + file .exists());
    
      } catch (IOException e) {
              e.printStackTrace();
      }
    
  • 8

    我这样做的方式如下:

    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转换为实际路径 . 所以结论是它取决于你想要转换为File的Uri的类型 .

  • 27

    @CommonsWare很好地解释了所有事情 . 我们真的应该使用他提出的解决方案 .

    顺便说一下,只有在查询 ContentResolver 时我们可以依赖的信息才是这里提到的文件名和大小:Retrieving File Information | Android developers

    如您所见,有一个界面 OpenableColumns 只包含两个字段:DISPLAY_NAME和SIZE .

    在我的情况下,我需要检索有关JPEG图像的EXIF信息,并在发送到服务器之前根据需要旋转它 . 为此,我使用 ContentResolveropenInputStream() 将文件内容复制到临时文件中

  • -2

    对于这种情况,特别是在Android上,字节的方式通常更快 .

    有了这个,我通过设置一个类_932383来解决它,它负责处理从文件到文件的读/写字节和一个类 UriHelper ,它负责找出Uri的路径和权限 .

    据我们所知, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset) 可以帮助我们将您想要的字符串传输到您需要的字节 .

    如何让UriHelper和FileHelper将Uri注释的图片复制到一个文件中,你可以运行:

    FileHelper.getInstance().copy(UriHelper.getInstance().toFile(uri_of_a_picture)
                            , FileHelper.getInstance().createExternalFile(null, UriHelper.getInstance().generateFileNameBasedOnTimeStamp()
                                    + UriHelper.getInstance().getFileName(uri_of_a_picture, context), context)
                    );
    

    关于我的UriHelper:

    public class UriHelper {
    private static UriHelper INSTANCE = new UriHelper();
    
    public static UriHelper getInstance() {
        return INSTANCE;
    }
    
    @SuppressLint("SimpleDateFormat")
    public String generateFileNameBasedOnTimeStamp() {
        return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
    }
    
    /**
     * if uri.getScheme.equals("content"), open it with a content resolver.
     * if the uri.Scheme.equals("file"), open it using normal file methods.
     */
    //
    
    public File toFile(Uri uri) {
        if (uri == null) return null;
        Logger.d(">>> uri path:" + uri.getPath());
        Logger.d(">>> uri string:" + uri.toString());
        return new File(uri.getPath());
    }
    
    public DocumentFile toDocumentFile(Uri uri) {
        if (uri == null) return null;
        Logger.d(">>> uri path:" + uri.getPath());
        Logger.d(">>> uri string:" + uri.toString());
        return DocumentFile.fromFile(new File(uri.getPath()));
    }
    
    public Uri toUri(File file) {
        if (file == null) return null;
        Logger.d(">>> file path:" + file.getAbsolutePath());
        return Uri.fromFile(file); //returns an immutable URI reference representing the file
    }
    
    public String getPath(Uri uri, Context context) {
        if (uri == null) return null;
        if (uri.getScheme() == null) return null;
        Logger.d(">>> uri path:" + uri.getPath());
        Logger.d(">>> uri string:" + uri.toString());
        String path;
        if (uri.getScheme().equals("content")) {
            //Cursor cursor = context.getContentResolver().query(uri, new String[] {MediaStore.Images.ImageColumns.DATA}, null, null, null);
            Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
            if (cursor == null) {
                Logger.e("!!! cursor is null");
                return null;
            }
            if (cursor.getCount() >= 0) {
                Logger.d("... the numbers of rows:" + cursor.getCount()
                            + "and the numbers of columns:" + cursor.getColumnCount());
                if (cursor.isBeforeFirst()) {
                    while (cursor.moveToNext()) {
                        StringBuilder stringBuilder = new StringBuilder();
                        for (int i = 0; i<cursor.getColumnCount(); i++) {
                            stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
                            stringBuilder.append("\n");
                        }
                        Logger.d(stringBuilder.toString());
                    }
                } else {
                    cursor.moveToFirst();
                    do {
                        StringBuilder stringBuilder = new StringBuilder();
                        for (int i = 0; i<cursor.getColumnCount(); i++) {
                            stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
                            stringBuilder.append("\n");
                        }
                        Logger.d(stringBuilder.toString());
                    } while (cursor.moveToNext());
                }
                path = uri.getPath();
                cursor.close();
                Logger.d("... content scheme:" + uri.getScheme() + "  and return:" + path);
                return path;
            } else {
                path = uri.getPath();
                Logger.d("... content scheme:" + uri.getScheme()
                        + " but the numbers of rows in the cursor is < 0:" + cursor.getCount()
                        + "  and return:" + path);
                return path;
            }
        } else {
            path = uri.getPath();
            Logger.d("... not content scheme:" + uri.getScheme() + "  and return:" + path);
            return path;
        }
    }
    
    public String getFileName(Uri uri, Context context) {
        if (uri == null) return null;
        if (uri.getScheme() == null) return null;
        Logger.d(">>> uri path:" + uri.getPath());
        Logger.d(">>> uri string:" + uri.toString());
        String path;
        if (uri.getScheme().equals("content")) {
            //Cursor cursor = context.getContentResolver().query(uri, new String[] {MediaStore.Images.ImageColumns.DATA}, null, null, null);
            Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
            if (cursor == null) {
                Logger.e("!!! cursor is null");
                return null;
            }
            if (cursor.getCount() >= 0) {
                Logger.d("... the numbers of rows:" + cursor.getCount()
                        + "and the numbers of columns:" + cursor.getColumnCount());
                if (cursor.isBeforeFirst()) {
                    while (cursor.moveToNext()) {
                        StringBuilder stringBuilder = new StringBuilder();
                        for (int i = 0; i<cursor.getColumnCount(); i++) {
                            stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
                            stringBuilder.append("\n");
                        }
                        Logger.d(stringBuilder.toString());
                    }
                } else {
                    cursor.moveToFirst();
                    do {
                        StringBuilder stringBuilder = new StringBuilder();
                        for (int i = 0; i<cursor.getColumnCount(); i++) {
                            stringBuilder.append("... iterating cursor.getString(" + i +"(" + cursor.getColumnName(i) + ")):" + cursor.getString(i));
                            stringBuilder.append("\n");
                        }
                        Logger.d(stringBuilder.toString());
                    } while (cursor.moveToNext());
                }
                cursor.moveToFirst();
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME));
                cursor.close();
                Logger.d("... content scheme:" + uri.getScheme() + "  and return:" + path);
                return path;
            } else {
                path = uri.getLastPathSegment();
                Logger.d("... content scheme:" + uri.getScheme()
                        + " but the numbers of rows in the cursor is < 0:" + cursor.getCount()
                        + "  and return:" + path);
                return path;
            }
        } else {
            path = uri.getLastPathSegment();
            Logger.d("... not content scheme:" + uri.getScheme() + "  and return:" + path);
            return path;
        }
    }
    

    }

    关于我的FileHelper:

    public class FileHelper {
    private static final String DEFAULT_DIR_NAME = "AmoFromTaiwan";
    private static final int DEFAULT_BUFFER_SIZE = 1024;
    private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
    private static final int EOF = -1;
    private static FileHelper INSTANCE = new FileHelper();
    
    public static FileHelper getInstance() {
        return INSTANCE;
    }
    
    private boolean isExternalStorageWritable(Context context) {
        /*
        String state = Environment.getExternalStorageState();
        return Environment.MEDIA_MOUNTED.equals(state);
        */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                Logger.e("!!! checkSelfPermission() not granted");
                return false;
            }
        } else { //permission is automatically granted on sdk<23 upon installation
            return true;
        }
    }
    
    private boolean isExternalStorageReadable(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                Logger.e("!!! checkSelfPermission() not granted");
                return false;
            }
        } else { //permission is automatically granted on sdk<23 upon installation
            return true;
        }
    }
    
    @SuppressLint("SimpleDateFormat")
    private String generateFileNameBasedOnTimeStamp() {
        return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
    }
    
    public File createExternalFile(String dir_name, String file_name, Context context) {
        String dir_path;
        String file_path;
        File dir ;
        File file;
        if (!isExternalStorageWritable(context)) {
            Logger.e("!!! external storage not writable");
            return null;
        }
        if (dir_name == null) {
            dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
        } else {
            dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
        }
        Logger.d("... going to access an external dir:" + dir_path);
        dir = new File(dir_path);
        if (!dir.exists()) {
            Logger.d("... going to mkdirs:" + dir_path);
            if (!dir.mkdirs()) {
                Logger.e("!!! failed to mkdirs");
                return null;
            }
        }
        if (file_name == null) {
            file_path = dir_path + File.separator + generateFileNameBasedOnTimeStamp();
        } else {
            file_path = dir_path + File.separator + file_name;
        }
        Logger.d("... going to return an external dir:" + file_path);
        file = new File(file_path);
        if (file.exists()) {
            Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
            if (!file.delete()) {
                Logger.e("!!! failed to delete file");
                return null;
            }
        }
        return file;
    }
    
    public File createInternalFile(String dir_name, String file_name, Context context) {
        String dir_path;
        String file_path;
        File dir ;
        File file;
        if (dir_name == null) {
            dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
        } else {
            dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
        }
        dir_path = dir.getAbsolutePath();
        Logger.d("... going to access an internal dir:" + dir_path);
        if (!dir.exists()) {
            Logger.d("... going to mkdirs:" + dir_path);
            if (!dir.mkdirs()) {
                Logger.e("!!! mkdirs failed");
                return null;
            }
        }
        if (file_name == null) {
            file = new File(dir, generateFileNameBasedOnTimeStamp());
        } else {
            file = new File(dir, file_name);
        }
        file_path = file.getAbsolutePath();
        Logger.d("... going to return an internal dir:" + file_path);
        if (file.exists()) {
            Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
            if (!file.delete()) {
                Logger.e("!!! failed to delete file");
                return null;
            }
        }
        return file;
    }
    
    public File getExternalFile(String dir_name, String file_name, Context context) {
        String dir_path;
        String file_path;
        File file;
        if (!isExternalStorageWritable(context)) {
            Logger.e("!!! external storage not writable");
            return null;
        }
        if (dir_name == null) {
            dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
        } else {
            dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
        }
        if (file_name == null) {
            file_path = dir_path;
        } else {
            file_path = dir_path + File.separator + file_name;
        }
        Logger.d("... going to return an external file:" + file_path);
        file = new File(file_path);
        if (file.exists()) {
            Logger.d("... file exists:" + file.getAbsolutePath());
        } else {
            Logger.e("!!! file does't exist:" + file.getAbsolutePath());
        }
        return file;
    }
    
    public File getInternalFile(String dir_name, String file_name, Context context) {
        String file_path;
        File dir ;
        File file;
        if (dir_name == null) {
            dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
        } else {
            dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
        }
        if (file_name == null) {
            file = new File(dir.getAbsolutePath());
        } else {
            file = new File(dir, file_name);
        }
        file_path = file.getAbsolutePath();
        Logger.d("... going to return an internal dir:" + file_path);
        if (file.exists()) {
            Logger.d("... file exists:" + file.getAbsolutePath());
        } else {
            Logger.e("!!! file does't exist:" + file.getAbsolutePath());
        }
        return file;
    }
    
    private byte[] readBytesFromFile(File file) {
        Logger.d(">>> path:" + file.getAbsolutePath());
        FileInputStream fis;
        long file_length;
        byte[] buffer;
        int offset = 0;
        int next = 0;
        if (!file.exists()) {
            Logger.e("!!! file doesn't exists");
            return null;
        }
        if (file.length() > Integer.MAX_VALUE) {
            Logger.e("!!! file length is out of max of int");
            return null;
        } else {
            file_length = file.length();
        }
        try {
            fis = new FileInputStream(file);
            //buffer = new byte[(int) file_length];
            buffer = new byte[(int) file.length()];
            long time_start = System.currentTimeMillis();
            while (true) {
                Logger.d("... now next:" + next + " and offset:" + offset);
                if (System.currentTimeMillis() - time_start > 1000) {
                    Logger.e("!!! left due to time out");
                    break;
                }
                next = fis.read(buffer, offset, (buffer.length-offset));
                if (next < 0 || offset >= buffer.length) {
                    Logger.d("... completed to read");
                    break;
                }
                offset += next;
            }
            //if (offset < buffer.length) {
            if (offset < (int) file_length) {
                Logger.e("!!! not complete to read");
                return null;
            }
            fis.close();
            return buffer;
        } catch (IOException e) {
            e.printStackTrace();
            Logger.e("!!! IOException");
            return null;
        }
    }
    
    public byte[] readBytesFromFile(File file, boolean is_fis_fos_only) {
        if (file == null) return null;
        if (is_fis_fos_only) {
            return readBytesFromFile(file);
        }
        Logger.d(">>> path:" + file.getAbsolutePath());
        FileInputStream fis;
        BufferedInputStream bis;
        ByteArrayOutputStream bos;
        byte[] buf = new byte[(int) file.length()];
        int num_read;
        if (!file.exists()) {
            Logger.e("!!! file doesn't exists");
            return null;
        }
        try {
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis);
            bos = new ByteArrayOutputStream();
            long time_start = System.currentTimeMillis();
            while (true) {
                if (System.currentTimeMillis() - time_start > 1000) {
                    Logger.e("!!! left due to time out");
                    break;
                }
                num_read = bis.read(buf, 0, buf.length); //1024 bytes per call
                if (num_read < 0) break;
                bos.write(buf, 0, num_read);
            }
            buf = bos.toByteArray();
            fis.close();
            bis.close();
            bos.close();
            return buf;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Logger.e("!!! FileNotFoundException");
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            Logger.e("!!! IOException");
            return null;
        }
    }
    
    /**
     * streams (InputStream and OutputStream) transfer binary data
     * if to write a string to a stream, must first convert it to bytes, or in other words encode it
     */
    public boolean writeStringToFile(File file, String string, Charset charset) {
        if (file == null) return false;
        if (string == null) return false;
        return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
    }
    
    public boolean writeBytesToFile(File file, byte[] data) {
        if (file == null) return false;
        if (data == null) return false;
        FileOutputStream fos;
        BufferedOutputStream bos;
        try {
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(data, 0, data.length);
            bos.flush();
            bos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
            Logger.e("!!! IOException");
            return false;
        }
        return true;
    }
    
    /**
     * io blocks until some input/output is available.
     */
    public boolean copy(File source, File destination) {
        if (source == null || destination == null) return false;
        Logger.d(">>> source:" + source.getAbsolutePath() + ", destination:" + destination.getAbsolutePath());
        try {
            FileInputStream fis = new FileInputStream(source);
            FileOutputStream fos = new FileOutputStream(destination);
            byte[] buffer = new byte[(int) source.length()];
            int len;
            while (EOF != (len = fis.read(buffer))) {
                fos.write(buffer, 0, len);
            }
            if (true) { //debug
                byte[] copies = readBytesFromFile(destination);
                if (copies != null) {
                    int copy_len = copies.length;
                    Logger.d("... stream read and write done for " + copy_len + " bytes");
                }
            }
            return destination.length() != 0;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    public void list(final String path, final String end, final List<File> files) {
        Logger.d(">>> path:" + path + ", end:" + end);
        File file = new File(path);
        if (file.isDirectory()) {
            for (File child : file.listFiles()){
                list(child.getAbsolutePath(), end, files);
            }
        } else if (file.isFile()) {
            if (end.equals("")) {
                files.add(file);
            } else {
                if (file.getName().endsWith(end)) files.add(file);
            }
        }
    }
    
    public String[] splitFileName(File file, String split) {
        String path;
        String ext;
        int lastIndexOfSplit = file.getAbsolutePath().lastIndexOf(split);
        if (lastIndexOfSplit < 0) {
            path = file.getAbsolutePath();
            ext = "";
        } else {
            path = file.getAbsolutePath().substring(0, lastIndexOfSplit);
            ext = file.getAbsolutePath().substring(lastIndexOfSplit);
        }
        return new String[] {path, ext};
    }
    
    public File rename(File old_file, String new_name) {
        if (old_file == null || new_name == null) return null;
        Logger.d(">>> old file path:" + old_file.getAbsolutePath() + ", new file name:" + new_name);
        File new_file = new File(old_file, new_name);
        if (!old_file.equals(new_file)) {
            if (new_file.exists()) { //if find out previous file/dir at new path name exists
                if (new_file.delete()) {
                    Logger.d("... succeeded to delete previous file at new abstract path name:" + new_file.getAbsolutePath());
                } else {
                    Logger.e("!!! failed to delete previous file at new abstract path name");
                    return null;
                }
            }
            if (old_file.renameTo(new_file)) {
                Logger.d("... succeeded to rename old file to new abstract path name:" + new_file.getAbsolutePath());
            } else {
                Logger.e("!!! failed to rename old file to new abstract path name");
            }
        } else {
            Logger.d("... new and old file have the equal abstract path name:" + new_file.getAbsolutePath());
        }
        return new_file;
    }
    
    public boolean remove(final String path, final String end) {
        Logger.d(">>> path:" + path + ", end:" + end);
        File file = new File(path);
        boolean result = false;
        if (file.isDirectory()) {
            for (File child : file.listFiles()){
                result = remove(child.getAbsolutePath(), end);
            }
        } else if (file.isFile()) {
            if (end.equals("")) {
                result = file.delete();
            } else {
                if (file.getName().endsWith(end)) result = file.delete();
            }
        } else {
            Logger.e("!!! child is not file or directory");
        }
        return result;
    }
    
    @TargetApi(Build.VERSION_CODES.O)
    public byte[] readNIOBytesFromFile(String path) throws IOException {
        Logger.d(">>> path:" + path);
        if (!Files.exists(Paths.get(path), LinkOption.NOFOLLOW_LINKS)) {
            Logger.e("!!! file doesn't exists");
            return null;
        } else {
            return Files.readAllBytes(Paths.get(path));
        }
    }
    
    @TargetApi(Build.VERSION_CODES.O)
    public File writeNIOBytesToFile(String dir, String name, byte[] data) {
        Logger.d(">>> dir:" + dir + ", name:" + name);
        Path path_dir;
        Path path_file;
        try {
            if (!Files.exists(Paths.get(dir), LinkOption.NOFOLLOW_LINKS)) {
                Logger.d("... make a dir");
                path_dir = Files.createDirectories(Paths.get(dir));
                if (path_dir == null) {
                    Logger.e("!!! failed to make a dir");
                    return null;
                }
            }
            path_file = Files.write(Paths.get(name), data);
            return path_file.toFile();
        } catch (IOException e) {
            e.printStackTrace();
            Logger.e("!!! IOException");
            return null;
        }
    }
    
    @TargetApi(Build.VERSION_CODES.O)
    public void listNIO(final String dir, final String end, final List<File> files) throws IOException {
        Logger.d(">>> dir:" + dir + ", end:" + end);
        Files.walkFileTree(Paths.get(dir), new FileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
                Logger.d("... file:" + dir.getFileName());
                return FileVisitResult.CONTINUE;
            }
    
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                Logger.d("... file:" + file.getFileName());
                if (end.equals("")) {
                    files.add(file.toFile());
                } else {
                    if (file.endsWith(end)) files.add(file.toFile());
                }
                return FileVisitResult.CONTINUE;
            }
    
            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) {
                Logger.d("... file:" + file.getFileName());
                if (end.equals("")) {
                    files.add(file.toFile());
                } else {
                    if (file.endsWith(end)) files.add(file.toFile());
                }
                return FileVisitResult.CONTINUE;
            }
    
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
                Logger.d("... file:" + dir.getFileName());
                return FileVisitResult.CONTINUE;
            }
        });
    }
    
    /**
     * recursion
     */
    private int factorial (int x) {
        if (x > 1) return (x*(factorial(x-1)));
        else if (x == 1) return x;
        else return 0;
    }
    

    }

  • 1

    对于那里寻找图像解决方案的人来说,特别是在这里 .

    private Bitmap getBitmapFromUri(Uri contentUri) {
            String path = null;
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null);
            if (cursor.moveToFirst()) {
                int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                path = cursor.getString(columnIndex);
            }
            cursor.close();
            Bitmap bitmap = BitmapFactory.decodeFile(path);
            return bitmap;
        }
    
  • 2

    文件imageToUpload = new File(新URI(androidURI.toString()));如果这是您在外部存储中创建的文件,则可以正常工作 .

    例如file:/// storage / emulated / 0 /(某些目录和文件名)

  • 2

    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));
    
    • 希望能帮助你----
  • 11

    通过以下代码,我能够将adobe应用程序共享的pdf文件作为流并保存到android应用程序路径中

    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;
                }
            }
    
  • -1

    基于@JacekKwiecień的扩展基础将 image uri 转换为 file

    fun Uri.toImageFile(context: Context): File? {
        val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
        val cursor = context.contentResolver.query(this, filePathColumn, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                val filePath = cursor.getString(columnIndex)
                cursor.close()
                return File(filePath)
            }
            cursor.close()
        }
        return null
    }
    

    如果我们使用 File(uri.getPath()) ,它将无法正常工作

    enter image description here

    如果我们使用android-ktx的扩展名,它仍然无效,因为https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt

相关问题