Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android高仿微信拍照、多選、預覽、刪除(去除相片)相冊功能

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

編輯:關於Android編程

先聲明授人與魚不如授人與漁,只能提供一個思路,當然需要源碼的同學可以私下有償問我要源碼:QQ:508181017

 

 

工作了將近三年時間了,一直沒正兒八經的研究系統自帶的相冊和拍照,這回來個高仿微信的拍照、多選、預覽、刪除(去除相片)相冊功能,之前開發的所有應用都帶有這需求,但是一直都不實用!廢話就不多說了,先來捋一下思路:

1、拍照能實時保存到本地並實時查詢(不必用廣播或者服務)

2、拍照保存到到自定義路徑並根據不同文件夾顯示文件夾下的相片

3、多選規定張數圖片

4、用到的集合有:

(1)、所有相片集合

(2)、不同文件下相片集合

(3)、系統保存相片的文件夾集合

(4)、已選中相片集合

5、每次選中返回上級界面時都要傳遞已選中的相片來跟當前所顯示的相冊集合進行對比使得checkbox是否勾選

6、自己碰到的問題有:

(1)、當選擇相片量超過特定數量時CheckBox的setOnCheckedChangeListener事件會出現錯誤(不是bug,可能我的代碼邏輯不夠嚴謹),主要是在設定控件自帶的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();
		}
	}
\\\\\\\

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved