国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android調用系統(tǒng)照相機拍照與攝像的方法

2019-10-22 18:12:20
字體:
來源:轉載
供稿:網友

前言

  在很多場景中,都需要用到攝像頭去拍攝照片或視頻,在照片或視頻的基礎之上進行處理。但是Android系統(tǒng)源碼是開源的,很多設備廠商均可使用,并且定制比較混亂。一般而言,在需要用到攝像頭拍照或攝像的時候,均會直接調用系統(tǒng)現(xiàn)有的相機應用,去進行拍照或攝像,我們只取它拍攝的結果進行處理,這樣避免了不同設備的攝像頭的一些細節(jié)問題。本篇博客將介紹在Android應用中,如何調用系統(tǒng)現(xiàn)有的相機應用去拍攝照片與短片,并對其進行處理,最后均會以一個簡單的Demo來演示效果。

1、系統(tǒng)現(xiàn)有相機應用的調用

  對于如何調用系統(tǒng)現(xiàn)有應用,之前就有講解,這里簡單再說一下。在開發(fā)的應用中調用系統(tǒng)現(xiàn)有應用,需要使用Intent指定開啟的應用的Action和Category,然后通過startActivity(Intent)或者startActivityForResult(Intent,int)開啟指定的Activity,如果使用startActivityForResult()方法開啟并需要返回值,再重寫onActivityResult(int,int,Intent)即可。

  先來看看系統(tǒng)現(xiàn)有相機應用的AndroidManifest.xml清單文件定義的Activity:

<activity  android:name="com.android.camera.Camera"  android:clearTaskOnLaunch="true"  android:configChanges="orientation|keyboardHidden"  android:screenOrientation="landscape"  android:taskAffinity="android.task.camera"  android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >  <intent-filter>  <action android:name="android.intent.action.MAIN" />  <categroy android:name="android.intent.category.DEFAULT" />  <categroy android:name="android.intent.category.LAUNCHER" />  </intent-filter>  <intent-filter>  <action android:name="android.media.action.IMAGE_CAPTURE" />  <categroy android:name="android.intent.category.DEFAULT" />  </intent-filter>  <intent-filter>  <action android:name="android.media.action.STILL_IMAGE_CAMERA" />  <categroy android:name="android.intent.category.DEFAULT" />  </intent-filter> </activity> <activity  android:name="com.android.camera.VideoCamera"  android:clearTaskOnLaunch="true"  android:configChanges="origientation|keyboardHidden"  android:label="@string/video_camera_label"  android:screenOrientation="landscape"  android:taskAffinity="android.task.camcorder"  android:theme="@android:style/theme.Black.NoTitleBar.Fullscreen" >  <intent-filter>  <action android:name="android.media.action.VIDEO_CAMERA" />  <categroy android:name="android.intent.category.DEFAULT" />  </intent-filter>  <intent-filter>  <action android:name="android.media.action.VIDEO_CAPTURE" />  <categroy android:name="android.intent.category.DEFAULT" />  </intent-filter> </activity>

  它定義了兩個Activity,com.android.camera.Camera表示照相機,com.android.camera.VideoCamera表示攝像機。從字面意思可以看出,為了捕獲系統(tǒng)相機返回的數據,一般需要使用一下兩個Action即可開啟照相機與攝像機:

  • android.media.action.IMAGE_CAPTURE:Intent的Action類型,從現(xiàn)有的相機應用中請求一張圖片。
  • android.media.action.VIDEO_CAPTURE:Intent的Action類型,從現(xiàn)有的相機應用中請求一段視頻。

  上面兩個參數,均在MediaStore類中以靜態(tài)常量的形式定義好了,分別是:MediaStore.ACTION_IMAGE_CAPTURE(相機)和MediaStore.ACTION_VIDEO_CAPTURE(攝像機)。

2、系統(tǒng)現(xiàn)有相機拍攝照片

  上面介紹到,開啟系統(tǒng)現(xiàn)有相機應用拍攝照片,需要用的MediaStore.ACTION_IMAGE_CAPTURE作為Intent的action開啟Activity即可。但是在使用系統(tǒng)現(xiàn)有相機用用的時候,默認會把圖片保存到系統(tǒng)圖庫的目錄下,如果需要指定圖片文件的保存路徑,需要額外在Intent中設置。

  設置系統(tǒng)現(xiàn)有相機應用的拍攝照片的保存路徑,需要用Intent.putExtra()方法通過MediaStore.EXTRA_OUTPUT去設置Intent的額外數據,這里傳遞的是一個Uri參數,可以是一個文件路徑的Uri。

Intent intent=new Intent();  // 指定開啟系統(tǒng)相機的Action  intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);  intent.addCategory(Intent.CATEGORY_DEFAULT);  // 根據文件地址創(chuàng)建文件  File file=new File(FILE_PATH);  // 把文件地址轉換成Uri格式  Uri uri=Uri.fromFile(file);  // 設置系統(tǒng)相機拍攝照片完成后圖片文件的存放地址  intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

3、獲取系統(tǒng)現(xiàn)有相機拍攝的圖片

  在新開啟的Activity中,如果需要獲取它的返回值,則需要使用startActivityForResult(Intent,int)方法開啟Activity,并重寫onActivityResult(int,int,Intent)獲取系統(tǒng)相機的返回數據,那么我們只需要在onActivityResult()中獲取到返回值即可。

  系統(tǒng)相機拍攝的照片,如果不指定路徑,會保存在系統(tǒng)默認文件夾下,可以使用Intent.getExtra()方法得到,得到的是一個Uri地址,表示了一個內容提供者的地址。如果通過MediaStore.EXTRA_OUTPUT指定了保存路徑,那么通過Intent.getExtra()得到的將是一個空地址,但是既然是我們指定的地址,那么也不愁找不到它了。 

4、系統(tǒng)現(xiàn)有相機拍攝圖片Demo

  上面講解了如何在開發(fā)的應用中使用系統(tǒng)相機拍攝照片并獲得它所涉及到的內容,下面通過一個簡單的Demo演示一下。在Demo中,有兩個Button分別以指定路徑的方式和不指定路徑的方式啟動系統(tǒng)相機,并獲取返回值顯示到ImageView中,Demo中注釋比較詳細,這里不再累述了。

布局代碼:activity_syscamera.xml

 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_StartCamera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="系統(tǒng)相機拍照--指定路徑到SD卡" /> <Button android:id="@+id/btn_StartCameraInGallery" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="系統(tǒng)相機拍照--默認圖庫" /> <ImageView android:id="@+id/iv_CameraImg" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>

實現(xiàn)代碼:SysCameraActivity.java

package cn.bgxt.callsystemcamera;import java.io.File;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;public class SysCameraActivity extends Activity { private Button btn_StartCamera, btn_StartCameraInGallery; private ImageView iv_CameraImg; private static final String TAG = "main"; private static final String FILE_PATH = "/sdcard/syscamera.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_syscamera); btn_StartCamera = (Button) findViewById(R.id.btn_StartCamera); btn_StartCameraInGallery = (Button) findViewById(R.id.btn_StartCameraInGallery); iv_CameraImg = (ImageView) findViewById(R.id.iv_CameraImg); btn_StartCamera.setOnClickListener(click); btn_StartCameraInGallery.setOnClickListener(click); } private View.OnClickListener click = new View.OnClickListener() { @Override public void onClick(View v) {    Intent intent = null;  switch (v.getId()) {  // 指定相機拍攝照片保存地址  case R.id.btn_StartCamera:  intent = new Intent();  // 指定開啟系統(tǒng)相機的Action  intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);  intent.addCategory(Intent.CATEGORY_DEFAULT);  // 根據文件地址創(chuàng)建文件  File file = new File(FILE_PATH);  if (file.exists()) {   file.delete();  }  // 把文件地址轉換成Uri格式  Uri uri = Uri.fromFile(file);  // 設置系統(tǒng)相機拍攝照片完成后圖片文件的存放地址  intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  startActivityForResult(intent, 0);  break;  // 不指定相機拍攝照片保存地址  case R.id.btn_StartCameraInGallery:  intent = new Intent();  // 指定開啟系統(tǒng)相機的Action  intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);  intent.addCategory(Intent.CATEGORY_DEFAULT);  startActivityForResult(intent, 1);  break;  default:  break;  } } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.i(TAG, "系統(tǒng)相機拍照完成,resultCode="+resultCode);  if (requestCode == 0) {  File file = new File(FILE_PATH);  Uri uri = Uri.fromFile(file);  iv_CameraImg.setImageURI(uri); } else if (requestCode == 1) {  Log.i(TAG, "默認content地址:"+data.getData());  iv_CameraImg.setImageURI(data.getData()); } }}

效果展示:

Android,系統(tǒng),照相機,拍照

 這里只是簡單的演示了如何調用系統(tǒng)現(xiàn)有的相機應用獲取拍攝的圖片,沒有做圖片資源的回收,所以可能會有內存溢出的錯誤,重新啟動應用即可。

5、系統(tǒng)現(xiàn)有相機拍攝視頻

  從系統(tǒng)現(xiàn)有的相機應用中獲取拍攝的視頻,與獲取拍攝的圖片過程大致相同,但是它除了可以通過putExtra()設置MediaStore.EXTRA_OUTPUT輸出路徑外,還可以設置其它值,這里簡單介紹一下:

  • MediaStore.EXTRA_OUTPUT:設置媒體文件的保存路徑。
  • MediaStore.EXTRA_VIDEO_QUALITY:設置視頻錄制的質量,0為低質量,1為高質量。
  • MediaStore.EXTRA_DURATION_LIMIT:設置視頻最大允許錄制的時長,單位為毫秒。
  • MediaStore.EXTRA_SIZE_LIMIT:指定視頻最大允許的尺寸,單位為byte。

6、系統(tǒng)現(xiàn)有相機拍攝視頻Demo

  既然和拍攝照片的流程一樣,這里就不再累述了,直接上Demo。在Demo中通過一個Button啟動一個系統(tǒng)現(xiàn)有相機拍攝視頻,最后保存在SD卡上。

實現(xiàn)代碼:

package cn.bgxt.callsystemcamera;import java.io.File;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import android.util.Log;import android.view.View;import android.widget.Button;public class SysVideoCameraActivity extends Activity { private Button btn_StartVideoCamera; private static final String FILE_PATH = "/sdcard/sysvideocamera.3gp"; private static final String TAG="main"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sysvideocamera); btn_StartVideoCamera = (Button) findViewById(R.id.btn_StartVideoCamera); btn_StartVideoCamera.setOnClickListener(click); } private View.OnClickListener click = new View.OnClickListener() { @Override public void onClick(View v) {  Intent intent = new Intent();  intent.setAction("android.media.action.VIDEO_CAPTURE");  intent.addCategory("android.intent.category.DEFAULT");  File file = new File(FILE_PATH);  if(file.exists()){  file.delete();  }  Uri uri = Uri.fromFile(file);  intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  startActivityForResult(intent, 0); } };  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.i(TAG, "拍攝完成,resultCode="+requestCode); }}

效果展示:

Android,系統(tǒng),照相機,拍照

源碼下載:Android調用系統(tǒng)照相機拍照與攝像

總結

到此就把如何使用系統(tǒng)現(xiàn)有相機應用拍攝照片與視頻都講解清楚了,在非相機相關的項目中,如果需要拍照的話,一般都是調用系統(tǒng)現(xiàn)有的相機應用,而不會直接調用Camera硬件去獲取圖像。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 中江县| 辽阳县| 会东县| 香港| 博湖县| 太原市| 广州市| 慈利县| 凯里市| 台安县| 黔东| 唐河县| 南阳市| 新和县| 舒兰市| 铁岭市| 黄平县| 岳阳市| 乐都县| 房产| 丹凤县| 固镇县| 长子县| 平南县| 景德镇市| 安溪县| 澄江县| 岳阳市| 江孜县| 呼和浩特市| 应城市| 松江区| 望谟县| 长白| 庆阳市| 紫金县| 白沙| 修水县| 绵竹市| 阜宁县| 恩平市|