安卓 - 如何从SD卡获取文件字节

3

我正在尝试获取SD卡中文档的一个字节。我所做的就是以下步骤;

1-) 我选择文件。

   fun openFile() {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "application/pdf"
    }
    startActivityForResult(intent, PICK_PDF_FILE)
}

输入图像描述

2-) 现在我有一个URI(统一资源标识符)。 我正在尝试将其转换为文件,然后尝试获取字节。

override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
    super.onActivityResult(requestCode, resultCode, resultData)

    if (requestCode == PICK_PDF_FILE && resultCode == Activity.RESULT_OK) {
        resultData?.data?.also { documentUri ->
            contentResolver.takePersistableUriPermission(
                documentUri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION
            )
            var file = documentUri.toFile(); // I am trying to convert URI to FILE type. //ERROR LINE
            Log.d("test" , file.readBytes().toString()) // I'm trying to read the bytes.
        }
    }
}

但是这个错误:

 Caused by: java.lang.IllegalArgumentException: Uri lacks 'file' scheme: 
 content://com.android.externalstorage.documents/document/primary%3ADCIM%2Ftest.pdf
2个回答

0

考虑使用 TaskCompletionSource 异步加载文件作为输入流:

TaskCompletionSource<Stream> tcs = new TaskCompletionSource<>();

在 openFile() 函数中:
if (tcs == null || tcs.Task.isCompleted || tcs.Task.isCanceled)
{
   startActivityForResult(Intent.createChooser(intent, "Select Document"), PICK_PDF_FILE);
   return tcs.getTask;
}
else
{
   return tcs.getTask;
}

在onActivityResult方法中:
if (requestCode == PICK_PDF_FILE && resultCode == Activity.RESULT_OK) {
   Uri uri = data.getData();
   tcs.setResult().getContentResolver().openInputStream(uri); 
}
else {
   tcs.setResult(null);
}

一旦您获得了InputStream,您可以将其转换为字节数组: 在Java中将InputStream转换为字节数组

但是,根据您需要使用字节的方式,您也可以直接使用流。例如,如果您想要转换PDF,则可以使用LEADTOOLS CloudServices库: https://www.leadtools.com/support/forum/posts/t12369-


0
File file = new File(path);
int size = (int) file.length();
byte[] bytes = new byte[size];
try {
    BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
    buf.read(bytes, 0, bytes.length);
    buf.close();
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

来源:Android:如何以字节形式读取文件?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接