安卓从googlephoto上选择云端图片导致程序崩溃的解决方案
2017-01-10 14:51
561 查看
当软件选择照片时,如果选择的是使用googlephoto或google云备份过,并在本地删除过的图片时,程序就会崩溃或图片是空白 ,报错原因:
原因是使用googlephoto备份过并在本地删除的图片会在手机中存储一个缩略图,其他软件调用googlephoto选择图片时依然能看到删除过的图片,但是此时图片的url已经不是本地的url了,而是一个图片的下载链接,这时使用getPath(url)会得到一个null路径。
国内的好多软件都存在这个问题,其实解决办法也很简单,就是通过在onactivityresult中把data.getData()得到的数据存到一个临时文件中做一个拷贝,再读取就可以了。
选择图片时要使用
//onActivityResult
IllegalArgumentException:InvalidURI:content://com.google.android.apps.photos.contentprovider/0/1/mediaKey%3A...6mkQk-P4tzU/ACTUAL/11...80
原因是使用googlephoto备份过并在本地删除的图片会在手机中存储一个缩略图,其他软件调用googlephoto选择图片时依然能看到删除过的图片,但是此时图片的url已经不是本地的url了,而是一个图片的下载链接,这时使用getPath(url)会得到一个null路径。
国内的好多软件都存在这个问题,其实解决办法也很简单,就是通过在onactivityresult中把data.getData()得到的数据存到一个临时文件中做一个拷贝,再读取就可以了。
选择图片时要使用
Intent.ACTION_GET_CONTENT
Intent selectPhoto = new Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); selectPhoto.setType("image/*"); startActivityForResult(selectPhoto,ONACTIVITYRESULT_SELECT_PHOTO);
//onActivityResult
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) { PictureManager.this.finish(); return; } else { switch (requestCode) { case BabyCareStaticConstant.ONACTIVITYRESULT_SELECT_PHOTO:// select // 创建空文件用于保存图片数据 File tempFile = new File(this.getFilesDir().getAbsolutePath(), "temp_image"); //拷贝uri内容到空文件中 try { tempFile.createNewFile(); copyAndClose(this.getContentResolver().openInputStream(data.getData()),new FileOutputStream(tempFile)); } catch (IOException e) { //Log Error } //Now fetch the new URI Uri pickedUri = Uri.fromFile(tempFile); String imgPath = pickedUri.toString(); if (imgPath.indexOf("file://") > -1) { // 如果是从文件管理器读取的绝对路径,直接删掉开头的"file://"即可 imgPath = imgPath.replace("file://", ""); } else if (imgPath.indexOf("content://") > -1) { // 如果是从相册中读取的相对路径,则需要转换成绝对路径 imgPath = BitmapHelper.getRealPathFromURI( PictureManager.this, pickedUri); } returnToFirstActivity(imgPath, new PictureHelper().imageName); break; } } }
相关文章推荐
- Android在选择系统相册图片时,返回的图片地址不同导致程序崩溃!!!
- FindContours()函数使用时导致的程序崩溃问题的解决方案
- Windows 1709版本中OneDrive导致绝大多数程序崩溃的解决方案
- 关于Fragment中的getActivity()返回null导致程序崩溃的解决方案
- 安卓加载大背景图片或者加载大量本地资源图片时经常导致内存溢出(Out of Memory Error)推荐几种解决方案
- MFC中使用FindContours()函数使用时导致的程序崩溃问题的解决方案
- CFileDialog导致程序崩溃的解决方案
- Android 4.4从图库选择图片并裁剪,由于系统版本不同导致Uri的bug的几种解决方案
- iOS 同一页面加载上百张图片,迅速滑动时导致内存暴涨程序崩溃的参考解决方法
- vc++6.0STL中std::string类导致程序崩溃的解决方案
- MFC项目使用webbrowser控件,点击载入的页面里的文件下载链接后导致程序的崩溃问题的解决方案
- 让程序在崩溃时体面的退出之终极解决方案(SEH+Dump+Unhandled Exception Filter)
- windows 7 如何关闭 程序崩溃时弹出的"windows正在检查该问题的解决方案"
- open和add file to project功能导致VC++6.0程序崩溃的解决方法
- 让程序在崩溃时体面的退出之终极解决方案(SEH+Dump+Unhandled Exception Filter)
- QSqlDatabase 使用小结,解决部分数据库操作导致程序崩溃的办法
- 处理数组时,很多情况要注意判断数组的长度是否大于0,否则很容易因索引溢出而导致程序崩溃
- 一个WPF和SL的严重BUG,能导致任何的寄主程序崩溃
- 配置win2003 server IIS的总结,为什么IIs的工作进程会在空闲时间释放的问题。同时学会了throw的真正含义,throw的真正含义就是导致程序停止,崩溃,很简单,网摘也有记录。
- 大图片生成缩略图 导致imagecreatefromjpeg 内存崩溃问题