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

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

編輯:關於android開發

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


工作了將近三年時間了,一直沒正兒八經的研究系統自帶的相冊和拍照,這回來個高仿微信的拍照、多選、預覽、刪除(去除相片)相冊功能,

之前開發的全部應用都帶有這需求,可是一直都不有用!廢話就不多說了,先來捋一下思路:

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