Android开发之拍照功能实现
参考链接:http://www.linuxidc.com/Linux/2013-11/92892p3.htm
原文链接:http://blog.csdn.net/tangcheng_ok/article/details/7036871
增加使用相机和写入权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
主程序代码:
package com.example.carejulygpsmap; import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date; import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button; import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; public class CareJulyActivity extends ActionBarActivity { private final static String TAG = "CameraActivity";
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
private File picture;
private Button btnSave; private static final int NONE = 0;
private static final int PHOTO_GRAPH = 1;// 拍照
private static final int PHOTO_ZOOM = 2; // 缩放
private static final int PHOTO_RESOULT = 3;// 结果
private static final String IMAGE_UNSPECIFIED = "image/*";
private ImageView imageView = null;
private Button btnPhone = null;
private Button btnTakePicture = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_care_july);
setupViews();
// imageView = (ImageView) findViewById(R.id.imageView);
// btnPhone = (Button) findViewById(R.id.btnPhone);
// btnPhone.setOnClickListener(onClickListener);
// btnTakePicture = (Button) findViewById(R.id.btnTakePicture);
// btnTakePicture.setOnClickListener(onClickListener);
} // @Override//src
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_care_july);
// } @Override//src
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.care_july, menu);
return true;
} @Override//src
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} //CamCap
private void setupViews(){
surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components
surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components
surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); btnSave = (Button) findViewById(R.id.save_pic); btnSave.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
takePic();
}
});
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA
|| keyCode == KeyEvent.KEYCODE_SEARCH) {
takePic();
return true;
}
return super.onKeyDown(keyCode, event);
} private void takePic() { camera.stopPreview();// stop the preview camera.takePicture(null, null, pictureCallback); // picture
} // Photo call back
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
//@Override
public void onPictureTaken(byte[] data, Camera camera) {
new SavePictureTask().execute(data);
camera.startPreview();
}
}; // save pic
//保存图片,不过保存的图片较小,保存在根目录 的wishchin文件夹里面
class SavePictureTask extends AsyncTask<byte[], String, String> {
@Override
protected String doInBackground(byte[]... params) {
String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg"; Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());
//picture = new File(Environment.getExternalStorageDirectory(),fname);// create file picture = new File(Environment.getExternalStorageDirectory()+"/wishchin/"+fname); try {
FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream
fos.write(params[0]); // Written to the file
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
} // SurfaceHodler Callback handle to open the camera, off camera and photo size changes
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCallback====");
camera = Camera.open(); // Turn on the camera
try {
camera.setPreviewDisplay(holder); // Set Preview
} catch (IOException e) {
camera.release();// release camera
camera = null;
}
} public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.i(TAG,"====surfaceChanged");
Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain
parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format
// parameters.set("rotation", 180); // Arbitrary rotation
camera.setDisplayOrientation(0);
// parameters.setPreviewSize(400, 300); // Set Photo Size
camera.setParameters(parameters); // Setting camera parameters
camera.startPreview(); // Start Preview
} public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG,"====surfaceDestroyed");
camera.stopPreview();// stop preview
camera.release(); // Release camera resources
camera = null;
}
};
}
界面代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <android.view.SurfaceView
android:id="@+id/camera_preview"
android:layout_width="462dp"
android:layout_height="534dp"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:layout_gravity="center_vertical|center_horizontal" /> <Button
android:id="@+id/save_pic"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="txt_save" /> </LinearLayout>
Android开发之拍照功能实现的更多相关文章
- Android使得手机拍照功能的发展(源共享)
Android系统调用手机拍照功能有两种方法来直接调用手机自带摄像头还有一个就是要当心自己的节拍. 例Camera360 强大的一个在每个操作系统都有一个手机摄影软件:您可以捕捉不同风格,不同特效的照 ...
- Android开发 Camera2开发_1_拍照功能开发
介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用Camera1但是,不管是各种机型适配还是拍照参数自定义都是 ...
- Xamarin.Android 调用手机拍照功能
最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~ 实现思路:首先加载-- ...
- Android开发之发送邮件功能的实现(源代码分享)
Android开发中可能会碰到如何发送邮件的困扰,之前我也查了相关的文档,博友们也分享了不少的发送邮件的办法,总共有3种把,我仔细阅读了下,发现有的讲的太过复杂跟麻烦,不够清晰,我今天就来分享下我认为 ...
- Android开发之发送邮件功能的实现(源码分享)
Android开发中可能会碰到怎样发送邮件的困扰,之前我也查了相关的文档,博友们也分享了不少的发送邮件的办法.总共同拥有3种把,我细致阅读了下,发现有的讲的太过复杂跟麻烦,不够清晰.我今天就来分享下我 ...
- 实现调用Android手机的拍照功能
很简单,直接上示例吧 1 xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...
- Android实现手机拍照功能
一.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmln ...
- Android开发必有功能,更新版本提示,检测是否有新版本更新。下载完成后进行安装。
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. 给大家介绍个东西,MarkDown真的超级超级好用.哈哈.好了, 正题内容如下: 先 ...
- Android开发 处理拍照完成后的照片角度
private void initImageAngle(){ Bitmap imageBitmap = BitmapFactory.decodeFile(FilePathSession.getFace ...
随机推荐
- Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Hybrid端口)
>Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Hybrid端口) >>实验开始,先上拓扑图参考: >>>实验目标:分别实现主 ...
- 【Codeforces 478C】Table Decorations
[链接] 我是链接,点我呀:) [题意] 给你r,g,b三种颜色的气球 每张桌子要放3个气球 但是3个气球的颜色不能全都一样 (允许两个一样,或者全都不一样) 问你最多能装饰多少张桌子 [题解] 先把 ...
- apache zookeeper的安装
original article:http://zookeeper.praveendeshmane.co.in/zookeeper/zookeeper-3-4-6-single-server-setu ...
- 多个机器获取微信access-token导致的有效性问题
多个机器获取微信access-token导致的有效性问题 单个机器获取的access-token,只有最后一个是有效的: 多个机器各自获取自己的access-token,都是各自有效的: 在服务器和本 ...
- uva 11605 - Lights inside a 3d Grid(概率)
option=com_onlinejudge&Itemid=8&page=show_problem&problem=2652" style=""& ...
- Unreal Engine 4 Camera Lag(摄影机延迟)
以官方的Third Person Template为样例,Character蓝图中的USpringArmComponent就实现了摄影机和场景碰撞和交互等大部分的功能了. 要实现摄影机延时,仅仅须要改 ...
- ExecutorCompletionService原理具体解释
在JDK并发包中有这么一个类ExecutorCompletionService,提交任务后,能够按任务返回结果的先后顺序来获取各任务运行后的结果. 该类实现了接口CompletionService: ...
- Codeforces Round #276 (Div. 1)B. Maximum Value 筛法
D. Maximum Value You are given a sequence a consisting of n integers. Find the maximum possible ...
- cocos2d-x 3.2 之 2048 —— 第二篇
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- hdoj--5100--Chessboard(数学推理)
Chessboard Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...