Android 调用系统相机拍摄获取照片的两种方法实现实例
程序员文章站
2024-02-27 14:54:27
android 调用系统相机拍摄获取照片的两种方法实现实例
在我们android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的照片。下面是我总结的两种方法...
android 调用系统相机拍摄获取照片的两种方法实现实例
在我们android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的照片。下面是我总结的两种方法获取拍摄之后的照片,一种是通过bundle来获取压缩过的照片,一种是通过sd卡获取的原图。
下面是演示代码:
布局文件:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal" > <button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拍照获取缩略图" /> <button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="14dp" android:text="拍照获取原图" /> <imageview android:id="@+id/imageview1" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/ic_launcher" /> </linearlayout>
java代码:
package com.example.cameardemo; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.ioexception; import android.content.intent; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.net.uri; import android.os.bundle; import android.os.environment; import android.provider.mediastore; import android.support.v7.app.actionbaractivity; import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.imageview; public class mainactivity extends actionbaractivity implements onclicklistener { private static int request_thumbnail = 1;// 请求缩略图信号标识 private static int request_original = 2;// 请求原图信号标识 private button button1, button2; private imageview mimageview; private string sdpath;//sd卡的路径 private string picpath;//图片存储路径 @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.fragment_main); button1 = (button) findviewbyid(r.id.button1); button2 = (button) findviewbyid(r.id.button2); mimageview = (imageview) findviewbyid(r.id.imageview1); button1.setonclicklistener(this); button2.setonclicklistener(this); //获取sd卡的路径 sdpath = environment.getexternalstoragedirectory().getpath(); picpath = sdpath + "/" + "temp.png"; log.e("sdpath1",sdpath); } @override public void onclick(view view) { switch (view.getid()) { case r.id.button1://第一种方法,获取压缩图 intent intent1 = new intent(mediastore.action_image_capture); // 启动相机 startactivityforresult(intent1, request_thumbnail); break; case r.id.button2://第二种方法,获取原图 intent intent2 = new intent(mediastore.action_image_capture); uri uri = uri.fromfile(new file(picpath)); //为拍摄的图片指定一个存储的路径 intent2.putextra(mediastore.extra_output, uri); startactivityforresult(intent2, request_original); break; default: break; } } /** * 返回应用时回调方法 */ @override protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if (resultcode == result_ok) { if (requestcode == request_thumbnail) {//对应第一种方法 /** * 通过这种方法取出的拍摄会默认压缩,因为如果相机的像素比较高拍摄出来的图会比较高清, * 如果图太大会造成内存溢出(oom),因此此种方法会默认给图片尽心压缩 */ bundle bundle = data.getextras(); bitmap bitmap = (bitmap) bundle.get("data"); mimageview.setimagebitmap(bitmap); } else if(resultcode == request_original){//对应第二种方法 /** * 这种方法是通过内存卡的路径进行读取图片,所以的到的图片是拍摄的原图 */ fileinputstream fis = null; try { log.e("sdpath2",picpath); //把图片转化为字节流 fis = new fileinputstream(picpath); //把流转化图片 bitmap bitmap = bitmapfactory.decodestream(fis); mimageview.setimagebitmap(bitmap); } catch (filenotfoundexception e) { e.printstacktrace(); }finally{ try { fis.close();//关闭流 } catch (ioexception e) { e.printstacktrace(); } } } } } }
最后不要忘记在清单文件上添加上读取sd卡的权限:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.cameardemo" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="8" android:targetsdkversion="19" /> <!-- 操作sd卡的权限 --> <uses-permission android:name="android.permission.write_external_storage"/> <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="com.example.cameardemo.mainactivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> <!-- 具有相机功能 --> <intent-filter > <action android:name="android.media.action.image_capture"/> <category android:name="android.intent.category.default" /> </intent-filter> </activity> </application> </manifest>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!