編輯:關於Android編程
先聲明授人與魚不如授人與漁,只能提供一個思路,當然需要源碼的同學可以私下有償問我要源碼:QQ:508181017
工作了將近三年時間了,一直沒正兒八經的研究系統自帶的相冊和拍照,這回來個高仿微信的拍照、多選、預覽、刪除(去除相片)相冊功能,之前開發的所有應用都帶有這需求,但是一直都不實用!廢話就不多說了,先來捋一下思路:
1、拍照能實時保存到本地並實時查詢(不必用廣播或者服務)
2、拍照保存到到自定義路徑並根據不同文件夾顯示文件夾下的相片
3、多選規定張數圖片
4、用到的集合有:
(1)、所有相片集合
(2)、不同文件下相片集合
(3)、系統保存相片的文件夾集合
(4)、已選中相片集合
5、每次選中返回上級界面時都要傳遞已選中的相片來跟當前所顯示的相冊集合進行對比使得checkbox是否勾選
6、自己碰到的問題有:
(1)、當選擇相片量超過特定數量時CheckBox的setOnCheckedChangeListen
(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(); Map(3)、獲取對應相冊下的照片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; }
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(); } }
把Android SDK升級到了最新版本,但是Eclipse的ADT插件需要Eclipse3.6版本以上才可以安裝,無奈下載了Eclipse3.7版本的。一
本文實例講述了Android EditText自定義樣式的方法。分享給大家供大家參考,具體如下:1.去掉邊框EditText的background屬性設置為@null就搞
為了讓用戶的使用更舒適所以有些情況使用動畫是很有必要的,Android在3.0以前支持倆種動畫Tween動畫以及Frame動畫。Tween動畫支持簡單的平移,縮放,旋轉,
本文以案例形式分析了Android中TelephonyManager類的用法。分享給大家供大家參考。具體如下:目錄結構:main.xml布局文件:<?xml