• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > android高仿微信拍照、多选、预览、删除(去除相片)相冊功能

android高仿微信拍照、多选、预览、删除(去除相片)相冊功能

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android高仿微信,android高仿美团,android高仿陌陌,android高仿qq源码,android 高仿网易等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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();
		}
	}
\\\\\
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • android高仿京东垂直循环滚动新闻栏
  • android高仿微信拍照、多选、预览、删除(去除相片)相冊功能

相关文章

  • 2017-05-26android 编程小技巧(持续中)
  • 2017-05-224.2.3 Service精通
  • 2017-05-26Android之文件数据存储,android数据存储
  • 2017-05-26x11vnc无法识别大写状态键的解决方法
  • 2017-11-18android TCP自动重连
  • 2017-05-26Andoid自定义View系统学习参考,andoidview
  • 2017-05-26Android Git 客户端,androidgit客户端
  • 2017-07-22Android性能优化
  • 2017-05-26android 获取GPS定位,androidgps定位
  • 2017-05-26nginx rewrite常用示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android消息机制之Handler,androidhandler
    • Android Studio安装指南及genymotion配置
    • 测试新建博文,新建博文
    • Android热补丁动态修复技术(三)—— 使用Javassist注入字节码,完成热补丁框架雏形(可使用)
    • java中random随机函数的一些理解
    • 对YUV数据进行裁剪,YUV数据进行裁剪
    • Android工程文件下assets文件夹与res文件夹的区别
    • Android安全专项之Xposed劫持用户名密码实践
    • Android View体系(二)实现View滑动的六种方法
    • Android中Intent在Activity之间传递对象[Serializable或Parcelable]

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有