android高仿拍照、多選、預覽、刪除(去除相片)相簿功能
先聲明授人與魚不如授人與漁,只能提供一個思路,當然需要源碼的同學可以私下有償問我要源碼:QQ:508181017
工作了將近三年時間了,一直沒正兒八經的研究系統內建的相簿和拍照,這回來個高仿的拍照、多選、預覽、刪除(去除相片)相簿功能,之前開發的所有應用都帶有這需求,但是一直都不實用!廢話就不多說了,先來捋一下思路:
1、拍照能即時儲存到本地並即時查詢(不必用廣播或者服務)
2、拍照儲存到到自訂路徑並根據不同檔案夾顯示檔案夾下的相片
3、多選規定張數圖片
4、用到的集合有:
(1)、所有相片集合
(2)、不同檔案下相片集合
(3)、系統儲存相片的檔案夾集合
(4)、已選中相片集合
5、每次選中返回上級介面時都要傳遞已選中的相片來跟當前所顯示的相簿集合進行對比使得checkbox是否勾選
6、自己碰到的問題有:
(1)、當選擇相片量超過特定數量時CheckBox的setOnCheckedChangeListener事件會出現錯誤(不是bug,可能My Code邏輯不夠嚴謹),主要是在設定控制項內建的setChecked(false|true)方法時出現的;所以我用了onClick方法來實現其選中狀態。
(2)、預覽相簿返回上級(展示檔案夾下的相片)時集合的對比,在考慮到效能的情況下,本人用了map集合來記錄儲存已選中的相片,回調介面時遍曆當前檔案夾下的相片判斷map集合是否包含,包含則讓checkbox為選中狀態。
(3)、在刪除圖片時,自己的業務並不和的一樣,此項目只讓使用者選中和不選中而已回調到介面一樣是可以顯示自己所要的效果。
7、主要代碼:
(1)、擷取最近照片列表
public List getCurrent() {Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.DATA,ImageColumns.DATE_ADDED, ImageColumns.SIZE }, null, null, ImageColumns.DATE_ADDED);if (cursor == null || !cursor.moveToNext())return new ArrayList();List photos = new ArrayList();cursor.moveToLast();do {if (cursor.getLong(cursor.getColumnIndex(ImageColumns.SIZE)) > 1024 * 10) {PhotoModel photoModel = new PhotoModel();photoModel.setOriginalPath(cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));photos.add(photoModel);}} while (cursor.moveToPrevious());return photos;}(2)、擷取所有相簿清單
public List getAlbums() {List albums = new ArrayList();Map map = new HashMap();Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.DATA,ImageColumns.BUCKET_DISPLAY_NAME, ImageColumns.SIZE }, null, null, null);if (cursor == null || !cursor.moveToNext())return new ArrayList();cursor.moveToLast();AlbumModel current = new AlbumModel("最近照片", 0, cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)), true); // "最近照片"相簿albums.add(current);do {if (cursor.getInt(cursor.getColumnIndex(ImageColumns.SIZE)) < 1024 * 10)continue;current.increaseCount();String name = cursor.getString(cursor.getColumnIndex(ImageColumns.BUCKET_DISPLAY_NAME));if (map.keySet().contains(name))map.get(name).increaseCount();else {AlbumModel album = new AlbumModel(name, 1, cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));map.put(name, album);albums.add(album);}} while (cursor.moveToPrevious());return albums;}(3)、擷取對應相簿下的照片
public List getAlbum(String name) {Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.BUCKET_DISPLAY_NAME,ImageColumns.DATA, ImageColumns.DATE_ADDED, ImageColumns.SIZE }, "bucket_display_name = ?",new String[] { name }, ImageColumns.DATE_ADDED);if (cursor == null || !cursor.moveToNext())return new ArrayList();List photos = new ArrayList();cursor.moveToLast();do {if (cursor.getLong(cursor.getColumnIndex(ImageColumns.SIZE)) > 1024 * 10) {PhotoModel photoModel = new PhotoModel();photoModel.setOriginalPath(cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));photos.add(photoModel);}} while (cursor.moveToPrevious());return photos;}(4)、拍照並及時更新本地相簿
public void photo() {//Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//startActivityForResult(openCameraIntent, TAKE_PICTURE);try {File dir = new File(Environment.getExternalStorageDirectory()+ "/" + localTempImgDir);System.out.println("圖片名稱:"+dir.getPath());if (!dir.exists()){dir.mkdirs();} localTempImgFileName=System.currentTimeMillis()+".jpg";Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);File f = new File(dir, localTempImgFileName);// localTempImgDir和localTempImageFileName是自己定義的名字Uri u = Uri.fromFile(f);intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);intent.putExtra(MediaStore.EXTRA_OUTPUT, u);startActivityForResult(intent, ResultTag.CODE_TOPHOTO);} catch (ActivityNotFoundException e) {Toast.makeText(PublishActivity.this, "沒有找到儲存目錄",Toast.LENGTH_LONG).show();}}(5)、拍照並及時更新本地相簿
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data); //相機照相返回if (requestCode == ResultTag.CODE_TOPHOTO) {File f = new File(Environment.getExternalStorageDirectory() + "/" + localTempImgDir + "/" + localTempImgFileName);String sdStatus = Environment.getExternalStorageState();if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 檢測sd是否可用Log.v("TestFile","SD card is not avaiable/writeable right now.");return;}try {Uri u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(),f.getAbsolutePath(), null, null));System.out.println("地址為:"+f.getAbsolutePath());MediaScannerConnection.scanFile(this, new String[] { f.getAbsolutePath()}, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } });} catch (FileNotFoundException e) {e.printStackTrace();} PhotoModel takePhoto = new PhotoModel();takePhoto.setChecked(true);takePhoto.setOriginalPath(f.getAbsolutePath());selectedShow.add(takePhoto); adapter.notifyDataSetChanged();}}