android高仿微信拍照、多選、預覽、刪除(去除相片)相簿功能

來源:互聯網
上載者:User

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();}}


 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.