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 ...
随机推荐
- SpringMVC demo 小例子,实现简单的登录和注册
1.创建一个动态的web工程 2.导入springMvc所需要的jar包(这里可以去网上找,资源有很多) 前两部就不详细描述了,后面才是正经代码~ 首先有一个web.xml文件,这个属于大配置文件,由 ...
- (43). Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...
- nyoj_85_有趣的数_201312122130
有趣的数 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 把分数按下面的办法排成一个数表. 1/1 1/2 1/3 1/4..... 2/1 2/2 ...
- [poj2417]Discrete Logging_BSGS
Discrete Logging poj-2417 题目大意:求$a^x\equiv b(mod\qquad c)$ 注释:O(分块可过) 想法:介绍一种算法BSGS(Baby-Step Giant- ...
- BZOJ——T 2097: [Usaco2010 Dec]Exercise 奶牛健美操
http://www.lydsy.com/JudgeOnline/problem.php?id=2097 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- Oracle Auto Increment Column - Sequence as Default Value
Solution 1: Prior to Oracle 11g, sequence assignment to a number variable could be done through ...
- 为什么视频流一般都用UDP
我们知道TCP 和 UDP的一个区别之一就是TCP要保证丢失的package会被再次重发,确保对方能够收到. 而在视频播放中,如果有一秒钟的信号确实,导致画面出现了一点瑕疵,那么最合适的办法是把这点瑕 ...
- JDBC数据源(DataSource)数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。
JDBC数据源(DataSource)的简单实现 数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用. 2.数据源提供了一种简单获取数据库连接的方式,并能在内部通 ...
- Linux 大规模请求server连接数相关设置
一般一个大规模Linuxserver请求数可能是几十万上百万的情况.须要足够的连接数来使用,所以务必进行对应的设置. 默认的Linuxserver文件描写叙述符等打开最大是1024.用ulimit - ...
- 通过loosejar清理应用中冗余的jar包
随着应用规模的逐渐增大,依赖的jar包数量也大幅添加.当中不乏多余的,用不到的jar包,占用了大量的宝贵空间.通过loosejar这个工具.便可轻松找到"滥竽充数"的jar包了~ ...