java.lang.IllegalArgumentException: the bind value at index 1 is null
at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)
自定义相机拍摄了多张图片,保存到本地并添加到系统相册,然后在自定义的相册中浏览拍摄的图片并删除的时候第一张没问题,删第二张就报上面的异常了。
删除图片的方法除了删除本地的图片file,同时也删除数据库中该数据。看信息是由个值为空。查看日志:
E/PhotoAlbumDetailActvty2: deleteImage,imgRealPath:/storage/emulated/0/faceallRecog/IMG_20171204_214942.jpg,imgPathcontent://media/external/images/media/27706
E/PhotoAlbumDetailActvty2: deleteImage,imgRealPath:null,imgPathcontent://media/external/images/media/27706
第一行是删除的第一张图片,第二行是删除的第二张图片,可以看到imgRealPath为null,而imgPath为第一张图片的。
在看删除的方法:
private void deleteImage(String imgPath) {
String imgRealPath = getRealPathFromUri(activity, Uri.parse(imgPath));
Log.e(TAG, "deleteImage,imgRealPath:" + imgRealPath + ",imgPath" + imgPath);
ContentResolver resolver = activity.getContentResolver();
Cursor cursor = MediaStore.Images.Media.query(resolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=?",
new String[]{imgRealPath}, null);
可知是删除第二张图片时传入的参数imgPath是第一张图片的路径,而第一张已经删除,导致imgRealPath为空。
在上面的写法中,图片删除后deleteImage(String imgPath)中imgPath依旧是被删除的图片路径,在继续删除时会报上面的异常。
现修改为:
private int selectIndex;//选择的图片的下标
private void getImgUriStr(final int index) { //该方法是在adapter中调用,从adapter点击中获取index数据,传给selectIndex
selectIndex=index;
Log.e("selectIndex",selectIndex+"");
//删除图片
private void deleteImage() {
//解决自定义相机拍摄多张照片后查看图片并删除多张图片时崩溃的问题。删除图片会导致图片的总数发生变化,传入selectIndex获取最新的图片uri。
selectImgUri = currentLabelList.get(selectIndex).getOriginalUri();
imgId = currentLabelList.get(selectIndex).getMediaID();
String imgRealPath = getRealPathFromUri(activity, Uri.parse(selectImgUri));
Log.e(TAG, "deleteImage,imgRealPath:" + imgRealPath + ",selectImgUri:"+selectImgUri);
ContentResolver resolver = activity.getContentResolver();
Cursor cursor = MediaStore.Images.Media.query(resolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=?",
new String[]{imgRealPath}, null);
boolean result = false;
if (cursor!=null&&cursor.moveToFirst()) {
long id = cursor.getLong(0);
Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Uri uri = ContentUris.withAppendedId(contentUri, id);
int count = activity.getContentResolver().delete(uri, null, null);
activity.getContentResolver().notifyChange(uri, null);
result = count == 1;
} else {
File file = new File(imgRealPath);
result = file.delete();
}
//如果要删除的图片是收藏的图片,则要从收藏的表里删除
if (favFlag) {
helper.deleteFavouritesImg(imgId);
}
if (result) {
//把该图片从list中删除并刷新
removeFromList(currentLabelList, imgId);
//这个方法不能删除list中的元素
// currentLabelList.remove(imgPath);
myAdapter.notifyDataSetChanged();
viewPagerAdapter.notifyDataSetChanged();
showToast(activity, "删除成功");
}
//解决删除图片后顶部图片总数没有变化的bug。
tvCountView.setText((selectIndex + 1) + "/" + currentLabelList.size());
}
获取最新的图片数据,然后进行删除,上面的问题解决。