参考同一类别中提出的问题,并对此进行扩展:
How to get the file path from a URI that points to a PDF document?
(How to get the file path from a URI that points to a PDF document?)
我的问题:
在我的HTC 816 Desire手机中[注:此设备已升级到MarshMallow,但仍然崩溃了KitKat。作为开发人员,我经历过Camera故意打开以获取其捕获的图像,从未释放其资源。当我尝试拍摄第二张照片时,这导致内部崩溃。],返回的路径以"/document/primary:"
开头,并且保留在'pdfUri.getPath()'
中,导致找不到文件异常。另外,当我在'MediaStore.Images.Media.DATA'
中搜索时,返回的列索引为-1。
Q1。当列索引为-1时,我是否应该从文件路径中简单删除"/document/primary:"
。因为在更高版本的手机(23及更高版本)中,此(pdfUri.getPath())可以正常工作,为我提供了正确的路径。
Q2。我应该在哪里获得手机的补丁程序来修复Camera resource not releasing
错误,以及固件级别的其他错误。
如果没有正确提出问题,也请通过正确询问这个问题来指导我。
答案 0 :(得分:1)
为了解决该问题,我尝试执行以下操作:
我将使解决方案获得的通用代码适用于PDF以外的许多其他文件格式:
private String saveFileFromUri(Uri pdfUri){
try{
InputStream is=
baseActivity.getContentResolver().openInputStream(pdfUri);
byte[]bytesArray=new byte[is.available()];
int read=is.read(bytesArray);
//write to sdcard
File dir=new File(Environment.getExternalStorageDirectory(),"/PRJ");
boolean mkdirs=dir.mkdirs();
File myPdf=new
File(Environment.getExternalStorageDirectory(),"/PRJ/myPdf.pdf");
if(read==-1&&mkdirs){
}
FileOutputStream fos=new FileOutputStream(myPdf.getPath());
fos.write(bytesArray);
fos.close();
// System.out.println(fileString);
return myPdf.getPath();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
return null;}
为了能够释放Camera资源,我将使用基于表面视图的Camera Activity,它可以做到这一点。这是代码的一部分:
发布相机资源:
@Override
public void onPause()
{
super.onPause();
if (mCamera != null){
// mCamera.setPreviewCallback(null);
mPreview.getHolder().removeCallback(mPreview);
releaseMediaRecorder();
mCamera.release(); // release the camera for other applications
mCamera = null;
}
}
@Override
public void onResume() {
super.onResume();
if (mCamera == null) {
mCamera=getCameraInstance();
mPreview = new CameraPreview(this.getActivity(), mCamera);
preview.addView(mPreview);
}
}
快乐编码:-)