java - 如何从 Android 中的 URI 获取文件?

标签 java android file pdf uri

我正在尝试读取 PDF 文件,但它抛出 NoSuchFileException。我已经看到了一些解决方案,但在我的情况下似乎没有任何效果。我想阅读 PDF 文件。下面是我的代码:

 private void requestForResume() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    Intent chooser = Intent.createChooser(intent, "Upload PDF File");
    startActivityForResult(chooser, REQUEST_CODE);
}

这是我如何转换为文件:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE) {
        Uri uri = data.getData();
        String fileName = uri.getLastPathSegment();

        File resumeFile=new File(uri.getPath());
        try {

            PDDocument pdfResume=PDDocument.load(resumeFile);
            PDFTextStripper stripper=new PDFTextStripper();
            String resumeText=stripper.getText(pdfResume);
            Log.d("location",resumeText);
        } catch (IOException e) {
            Log.d("location","unable to load pdf"+e.toString());
        }

        fileEditText.setText(fileName);        
    }
}

请帮助我解决我的错误。

最佳答案

使用它会返回你的路径,将其放在文件中

@SuppressLint("NewApi")
public static String getFilePath(Context context, Uri uri) throws URISyntaxException {
    String selection = null;
    String[] selectionArgs = null;
    // Uri is different in versions after KITKAT (Android 4.4), we need to
    if (Build.VERSION.SDK_INT >= 19 && DocumentsContract.isDocumentUri(uri)) {//DocumentsContract.isDocumentUri(context.getApplicationContext(), uri))
        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            return Environment.getExternalStorageDirectory() + "/" + split[1];
        } else if (isDownloadsDocument(uri)) {
            final String id = DocumentsContract.getDocumentId(uri);
            uri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
        } else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];
            if ("image".equals(type)) {
                uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }
            selection = "_id=?";
            selectionArgs = new String[]{
                    split[1]
            };
        }
    }
    if ("content".equalsIgnoreCase(uri.getScheme())) {
        String[] projection = {
                MediaStore.Images.Media.DATA
        };
        Cursor cursor = null;
        try {
            cursor = context.getContentResolver()
                    .query(uri, projection, selection, selectionArgs, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            if (cursor.moveToFirst()) {
                return cursor.getString(column_index);
            }
        } catch (Exception e) {
        }
    } else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }
    return null;
}

/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is ExternalStorageProvider.
 */
public static boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is DownloadsProvider.
 */
public static boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is MediaProvider.
 */
public static boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}

文件文件=new File(getFilePath(getApplicationContext(),data.getData()));

关于java - 如何从 Android 中的 URI 获取文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42532956/

相关文章:

java - 单击按钮后我的应用程序崩溃

java - 为什么将 System.nanoTime() 转换为 Calendar 对象会给我错误的当前日期?

ios - 从 Parse.com 获取特定文件

Android DDMS 文件资源管理器不显示内容

linux - 查找修改过的文件并将它们回显到服务器根目录上的 txt 文件中

java - JSF 查看范围 : How to Check if an object is in the view tree

java - RxJava2 中 onBackPressureBuffer 的行为是什么

java - 想要在 Imagebutton 单击时创建 NavigationDrawer

java - 为什么 HttpServlet 类是一个抽象类?

android - 插图可绘制对象无法按照文档中的描述工作