如何从指向PDF文档的URI获取文件路径?

Laz*_*olj 14 pdf android

现在我的代码打开了默认的下载视图,它只显示我下载的PDF.我选择了一个PDF文件,我得到了这个:

内容://com.android.providers.downloads.documents/document/1171

我想得到这个:

/storage/emulated/0/Download/ch22Databases.pdf

我的问题是如何在Android中执行此操作?

我的代码:

public void PDF() {
    PDF = (Button) findViewById(R.id.FindPDFBtn);//Finds the button in design and put it into a button variable.
    PDF.setOnClickListener(//Listens for a button click.
        new View.OnClickListener() {//Creates a new click listener.
            @Override
            public void onClick(View v) {//does what ever code is in here when the button is clicked
                Intent intent = new Intent();
                intent.setType("application/pdf");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select a PDF "), SELECT_PDF);
            }
        }
    );
}

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

    //PDF
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PDF) {
            Uri selectedUri_PDF = data.getData();
            SelectedPDF = getPDFPath(selectedUri_PDF);
        }
    }
}

public String getPDFPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
Run Code Online (Sandbox Code Playgroud)

Gue*_*gon 6

在您的getPDFPath方法中添加以下代码段:

public String getPDFPath(Uri uri){

     final String id = DocumentsContract.getDocumentId(uri);
     final Uri contentUri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

     String[] projection = { MediaStore.Images.Media.DATA };
     Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null);
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
     cursor.moveToFirst();
     return cursor.getString(column_index);
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,此代码专门用于的文档DownloadProvider,要进一步实施,请查看Paul Burke的答案。我个人使用他的aFileChooser库来避免这种问题。

  • 如果我使用该方法,我会得到 **/document/1384** (2认同)

Com*_*are 5

我的问题是我如何在 Android 中做到这一点?

你没有。ACTION_GET_CONTENT与文件关系不大。

如果您绝对需要一个文件,请使用文件选择器库,而不是ACTION_GET_CONTENT.

如果要使用ACTION_GET_CONTENT,请停止尝试获取内容的文件系统路径。使用ContentResolveropenInputStream()在内容中的内容阅读,如果Urifilecontentandroid.resource方案。如果Urihttphttps方案,请使用 HTTP 客户端 API 。