我需要从sdcard中选择一个pdf文件并将其转换为字节数组。我不想展示它。我搜索了很多,但是没有答案。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SELECT_MAGAZINE_FILE && resultCode == RESULT_OK && data != null) {
// Let's read picked image data - its URI
Uri uri = data.getData();
System.out.println(uri);
System.out.println(uri.getPath());
File file = new File(uri.getPath());
//init array with file length
byte[] bytesArray = new byte[(int) file.length()];
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
fis.read(bytesArray); //read file into bytes[]
fis.close();
System.out.println(bytesArray);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我得到这个错误:
java.io.FileNotFoundException: /document/primary:myfile.pdf: open failed: ENOENT (No such file or directory)
最佳答案
充其量,仅当传递给Uri
的onActivityResult()
恰好具有file
方案时,您的代码才能工作。你没有。它具有content
方案。由于OutOfMemoryError
,您的代码也会失败很多,因为您的代码无法分配byte[]
。 PDF文件可能很大。
因此,您的首要任务是找到其他解决方案,而不是将整个PDF文件读入byte[]
,因为这将是不可靠的,并且您只能通过不执行任何操作来解决此问题。
最终,要在InputStream
标识的内容上获得Uri
,请使用ContentResolver
和openInputStream()
。
而且,从长远来看,您需要将此I / O移至后台线程,因为现在您将冻结UI,以花费您读取数据的时间。
请注意,有关Android应用程序开发的任何体面的书籍或课程都涉及对ContentResolver
值使用Uri
以及使用线程。
关于android - 从sdcard中选择一个pdf文件,然后在android studio中将其转换为字节数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45651638/