如何从Android Oreo及更高版本的downloads文件夹中上传文件?

时间:2018-11-24 13:41:32

标签: android kotlin

我正在尝试编写代码以从Android Oreo及更高版本上传文件。首先,我打算获取文件的uri。

intent_upload.action = Intent.ACTION_GET_CONTENT
return Intent.createChooser(intent_upload, pickerTitle)

但是,当我从下载文件夹中选择文件时,它从以下代码中返回空filepath。它完美适用于Android Oreo以下的设备,但是我找不到适用于android o及更高版本的任何解决方案。

请帮助

val id = DocumentsContract.getDocumentId(uri)
val contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id));
return getDataColumn(context, contentUri, null, null)

getDataColumn的代码如下

fun getDataColumn(context: Context, uri: Uri?, selection: String?,
                          selectionArgs: Array<String>?): String? {

        var cursor: Cursor? = null
        val column = "_data"
        val projection = arrayOf(column)

        try {
            cursor = context.contentResolver.query(uri!!, projection, selection, selectionArgs, null)
            val temp = context
            if (cursor != null && cursor.moveToFirst()) {
                val index = cursor.getColumnIndexOrThrow(column)
                return cursor.getString(index)
            }
        }catch (e:Exception){

        } finally {
            cursor?.close()
        }
        return null
    }

API 26及更高版本正在发生这种情况。

我的动机是从Android的downloads文件夹中上传pdf文件。

1 个答案:

答案 0 :(得分:0)

我知道这已经过期了。我也遇到了这个问题,并且能够从这个要点中找到解决方案。 FileUtils.java。只需在您的项目中使用该util类

只需将此处留给将来会遇到此问题的人们即可。浪费了几个小时的时间。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Uri uri = data.getData();
    File originalFile = new File(FileUtils.getRealPath(this,uri));
}