获取手机里面的图片,这是图库必备基本前置技能。
这个项目中删除图库的时候居然出现文件删除但是仍然能读到图片的信息,因为使用ContentResolver获取到的是手机数据库对外提供的内容提供者的数据库,只是单纯的File删除,是没有删掉该数据库的数据,所以读取的时候能读到图片的数据,但是却读不出图片。所以删除的时候两者都要一起删去。
public class MainActivity extends Activity {
private List<PhotoInfo> mods;
private PhotoAP adapter;
private ListView listView;
private Cursor cursor;
private String tag = "MainActivity";
// 设置获取图片的字段
private static final String[] STORE_IMAGES = {
MediaStore.Images.Media.DISPLAY_NAME, // 显示的名字
MediaStore.Images.Media.DATA, MediaStore.Images.Media.LONGITUDE, // 经度
MediaStore.Images.Media._ID, // id
MediaStore.Images.Media.BUCKET_ID, // dir id 目录
MediaStore.Images.Media.BUCKET_DISPLAY_NAME // dir name 目录名字
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cursor = MediaStore.Images.Media.query(getContentResolver(),
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, STORE_IMAGES);
mods = new ArrayList<PhotoInfo>();
adapter = new PhotoAP(this, mods);
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
Log.i(tag, "I got the Pictures : cursor.getCount()="+cursor.getCount());
while (cursor.moveToNext()) {
String path = cursor.getString(1);
String id = cursor.getString(3);
String dir_id = cursor.getString(4);
String dir = cursor.getString(5);
mods.add(new PhotoInfo(path, id, dir_id, dir));
}
adapter.notifyDataSetChanged();
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
File file = new File(mods.get(arg2).getPath());
// /////////// 使用文件删除之后,数据库还没有删除
if (file.exists()) {
if (file.delete()) {
Toast.makeText(MainActivity.this,
file.getPath() + "删除成功", 1).show();
} else {
Toast.makeText(MainActivity.this,
file.getPath() + "删除失败", 1).show();
}
String params[] = new String[] { file.getPath() };
MainActivity.this.getContentResolver().delete(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.Media.DATA + " LIKE ?", params);
mods.clear();
cursor = MediaStore.Images.Media.query(
getContentResolver(),
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
STORE_IMAGES);
while (cursor.moveToNext()) {
String path = cursor.getString(1);
String id = cursor.getString(3);
String dir_id = cursor.getString(4);
String dir = cursor.getString(5);
mods.add(new PhotoInfo(path, id, dir_id, dir));
}
adapter.notifyDataSetChanged();
} else {
Toast.makeText(MainActivity.this, file.getPath() + "不存在", 1)
.show();
}
}
});
}
}
除了、
if (file.exists()) {
if (file.delete()) {
// 删除成功
}
}
不要忘记删除数据库:
MainActivity.this.getContentResolver().delete(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.Media.DATA + " LIKE ?", params);
这里的顺序也要注意,先删除数据库,可能导致找不到图片等错误,所以保证程序的正确性,先删除文件,然后删除数据库;
权限:
1打开关闭sdcard的权限
2读写sdcard的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>