Android Camera[通俗易懂]

Android Camera

大家好,又见面了,我是全栈君。

Android调用系统api使用照相机功能,实现拍照获取图片以及从照相机库中获取指定图片的功能。

下面是演示样例代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
	<ImageView android:layout_width="match_parent"
	    android:layout_height="100dip"
	    android:id="@+id/image"
	    />
 	<Button 
 	    android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="testPopupWindow"
        android:layout_below="@id/image"
        />

</RelativeLayout>

/**
 * 实现Popup弹出窗体并实现调用系统照相机功能
 * @author dream
 *
 */
public class TestPopupWindow extends Activity {
	private SelectPopupWindow popupWindow;
	private ImageView image;
	private Button btn;
	private Uri fileUri;     
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main1);
		init();
	}
	
	private void init(){
		image = (ImageView) findViewById(R.id.image);
		btn = (Button) findViewById(R.id.btn);
		btn.setOnClickListener(onClickListener);
		fileUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg")); //图片存放路径
	}
	
	View.OnClickListener onClickListener = new View.OnClickListener() {
		
		@Override
		public void onClick(View v) {
			switch(v.getId()){
			case R.id.btn:
				test();
				break;
			case R.id.takephoto:
				Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
				startActivityForResult(intent, 100);
				break;
			case R.id.selectfromalbum:
				Intent intent1 = new Intent(Intent.ACTION_PICK);
				intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
				startActivityForResult(intent1, 200);
				break;
				
			}
		}
	};
	
	
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if(requestCode == 100 && resultCode == RESULT_OK){
			int width = image.getWidth();
			int height = image.getHeight();
			BitmapFactory.Options opts = new BitmapFactory.Options();
			opts.inJustDecodeBounds = true;
			BitmapFactory.decodeFile(fileUri.getPath(), opts);
			int w = opts.outWidth;
			int h = opts.outHeight;
			int factor;
			if(w>width && h>height){
				factor = Math.min(w/width, h/height);  //依据ImageView的大小按一定比例缩小图片
			}else {
				factor = 1;
			}
			opts.inSampleSize = factor;
			opts.inJustDecodeBounds = false;
			Bitmap bm = BitmapFactory.decodeFile(fileUri.getPath(), opts);
			image.setImageBitmap(bm);
		} else if(requestCode == 200 && resultCode == RESULT_OK){
			int width = image.getWidth();
			int height = image.getHeight();
			BitmapFactory.Options opts = new BitmapFactory.Options();
			opts.inJustDecodeBounds = true;
			Uri uri = data.getData();
			try {
				InputStream in = getContentResolver().openInputStream(uri);
				BitmapFactory.decodeStream(in, null, opts);
				int w = opts.outWidth;
				int h = opts.outHeight;
				int factor;
				if(w>width && h>height){
					factor = Math.min(w/width, h/height);  //依据ImageView的大小按一定比例缩小图片
				}else {
					factor = 1;
				}
				opts.inSampleSize = factor;
				opts.inJustDecodeBounds = false;
				in = getContentResolver().openInputStream(uri);   //须要再次获取,由于前面流已经改变了
				Bitmap bm = BitmapFactory.decodeStream(in, null, opts);
				image.setImageBitmap(bm);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
	}

	public void test(){
		popupWindow = new SelectPopupWindow(this, onClickListener);
		popupWindow.showAtLocation(findViewById(R.id.main), 
				Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
	}
	
}

执行结果:

Android Camera[通俗易懂]

Android Camera[通俗易懂]

Android Camera[通俗易懂]

Android Camera[通俗易懂]

Android Camera[通俗易懂]

Android Camera[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115436.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java认证考试题目_java程序员工资一般多少

    java认证考试题目_java程序员工资一般多少第一部分基础知识练习目标本章对应于《学生指南》各章的内容分别提供了练习题集,包括:●第一章Java入门●第二章数据类型和运算符●第三章流程控制与数组●第四章封装●第五章继承

    2022年8月3日
    25
  • rocketmq长轮询原理_java长轮询

    rocketmq长轮询原理_java长轮询什么是长轮询whypush:broker推,优势:实时,长链接,不会频繁建立链接;缺点:慢消费,broker负载过高pull:客户端拉,优势:消费数量,速度可控;缺点:间隔难设定,过短,频繁网络请求,无效请求,过长:延迟消费为了保证实时,我们可以把拉取消息的间隔设置的短一点,但这也带来了一个另外一个问题,在没有消息的时候时候会有大量pull请求,为了解决这个问题,就采用了本文讲解的长轮询技术。轮询是以固定间隔请求服务器,它不在乎这次请求是否能拉取到消息。而长轮询,它请求的服务端,会等待一

    2022年10月14日
    3
  • CentOS 7修改网络接口名称

    CentOS 7修改网络接口名称

    2021年6月12日
    152
  • 第一章附加:线程锁synchronized方法,synchronized块和synchronied(this)总结[通俗易懂]

    第一章附加:线程锁synchronized方法,synchronized块和synchronied(this)总结[通俗易懂]第一章附加:线程锁synchronized方法,synchronized块和synchronied(this)总结

    2022年4月23日
    49
  • ADB Shell 命令_手机adb命令大全

    ADB Shell 命令_手机adb命令大全文章目录查看前台Activity调用Activity查看正在运行的Services调用Service发送广播查看应用详细信息查看应用列表清除应用数据与缓存查看屏幕分辨率查看屏幕密度屏幕截图录制屏幕查看前台Activityadbshelldumpsysactivityactivities或者adbshelldumpsysactivitytop调用Activit…

    2022年10月18日
    2
  • css3实现光标悬浮滚动菜单

    效果:http://hovertree.com/texiao/css3/21/本文所用到的CSS知识请点击效果展示也中第一和第二个链接。代码:转自:http://hovertree.com/h/bj

    2021年12月24日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号