編輯:關於android開發
工作了將近三年時間了,一直沒正兒八經的研究系統自帶的相冊和拍照,這回來個高仿微信的拍照、多選、預覽、刪除(去除相片)相冊功能,
之前開發的全部應用都帶有這需求,可是一直都不有用!廢話就不多說了,先來捋一下思路:
1、拍照能實時保存到本地並實時查詢(不必用廣播或者服務)
2、拍照保存到到自己定義路徑並依據不同目錄顯示目錄下的相片
3、多選規定張數圖片
4、用到的集合有:
(1)、全部相片集合
(2)、不同文件下相片集合
(3)、系統保存相片的目錄集合
(4)、已選中相片集合
5、每次選中返回上級界面時都要傳遞已選中的相片來跟當前所顯示的相冊集合進行對照使得checkbox是否勾選
6、自己碰到的問題有:
(1)、當選擇相片量超過特定數量時CheckBox的setOnCheckedChangeListen
所以我用了onClick方法來實現其選中狀態。
(2)、預覽相冊返回上級(展示目錄下的相片)時集合的對照。在考慮到性能的情況下,本人用了map集合來記錄保存已選中的相片。
回調界面時遍歷當前目錄下的相片推斷map集合是否包括,包括則讓checkbox為選中狀態。
(3)、在刪除圖片時,自己的業務並不和微信的一樣。此項目僅僅讓用戶選中和不選中而已回調到界面一樣是能夠顯示自己所要的效果。
7、主要代碼:
(1)、獲取近期照片列表
public List(2)、獲取全部相冊列表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; }
public List getAlbums() { List albums = new ArrayList(); Mapmap = 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(4)、拍照並及時更新本地相冊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; }
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(); } }
47.Android 自定義PopupWindow技巧 47.Android 自定義PopupWindow技巧 Android 自定義PopupWindow技巧 前言 P
SlidePictures,男同網pictures package com.example.SlidePictures; import java.util
Android進階中級教程——1.1 Git的本地使用詳解 Android進階中級教程——1.1 Git的本地使用詳解 標簽(空格分隔): And
打造簡易NineoldAndroids動畫庫,深入理解Android動畫原理 簡介 NineoldAndroids是Github上一個著名的動畫庫,簡單來說,Nine