1. 程式人生 > >android 呼叫 系統 相機 攝像機 拍照 拍視訊

android 呼叫 系統 相機 攝像機 拍照 拍視訊

主要內容如下:

系統現有相機應用的呼叫
系統現有相機拍攝照片
獲取系統現有相機拍攝的圖片
系統現有相機拍攝圖片Demo
系統現有相機拍攝視訊
系統現有相機拍攝視訊Demo


系統現有相機應用的呼叫

  對於如何呼叫系統現有應用,之前就有講解,這裡簡單再說一下。在開發的應用中呼叫系統現有應用,需要使用Intent指定開啟的應用的Action和Category,然後通過startActivity(Intent)或者startActivityForResult(Intent,int)開啟指定的Activity,如果使用startActivityForResult()方法開啟並需要返回值,再重寫onActivityResult(int,int,Intent)即可。

  先來看看系統現有相機應用的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表示攝像機。從字面意思可以看出,為了捕獲系統相機返回的資料,一般需要使用一下兩個Action即可開啟照相機與攝像機:
android.media.action.IMAGE_CAPTURE:Intent的Action型別,從現有的相機應用中請求一張圖片。
android.media.action.VIDEO_CAPTURE:Intent的Action型別,從現有的相機應用中請求一段視訊。
  上面兩個引數,均在MediaStore類中以靜態常量的形式定義好了,分別是:MediaStore.ACTION_IMAGE_CAPTURE(相機)和MediaStore.ACTION_VIDEO_CAPTURE(攝像機)。
系統現有相機拍攝照片


  上面介紹到,開啟系統現有相機應用拍攝照片,需要用的MediaStore.ACTION_IMAGE_CAPTURE作為Intent的action開啟Activity即可。但是在使用系統現有相機用用的時候,預設會把圖片儲存到系統圖庫的目錄下,如果需要指定圖片檔案的儲存路徑,需要額外在Intent中設定。
  設定系統現有相機應用的拍攝照片的儲存路徑,需要用Intent.putExtra()方法通過MediaStore.EXTRA_OUTPUT去設定Intent的額外資料,這裡傳遞的是一個Uri引數,可以是一個檔案路徑的Uri。

 Intent intent=new Intent();
 // 指定開啟系統相機的Action
 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
 intent.addCategory(Intent.CATEGORY_DEFAULT);
 // 根據檔案地址建立檔案
 File file=new File(FILE_PATH);
 // 把檔案地址轉換成Uri格式
 Uri uri=Uri.fromFile(file);
 // 設定系統相機拍攝照片完成後圖片檔案的存放地址
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

獲取系統現有相機拍攝的圖片

  在新開啟的Activity中,如果需要獲取它的返回值,則需要使用startActivityForResult(Intent,int)方法開啟Activity,並重寫onActivityResult(int,int,Intent)獲取系統相機的返回資料,那麼我們只需要在onActivityResult()中獲取到返回值即可。

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

系統現有相機拍攝圖片Demo

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

佈局程式碼:activity_syscamera.xml


實現程式碼:SysCameraActivity.java

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();
                 // 指定開啟系統相機的Action
                 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                 intent.addCategory(Intent.CATEGORY_DEFAULT);
                 // 根據檔案地址建立檔案
                 File file = new File(FILE_PATH);
                 if (file.exists()) {
                     file.delete();
                 }
                 // 把檔案地址轉換成Uri格式
                 Uri uri = Uri.fromFile(file);
                 // 設定系統相機拍攝照片完成後圖片檔案的存放地址
                 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                 startActivityForResult(intent, 0);
                 break;
             // 不指定相機拍攝照片儲存地址
             case R.id.btn_StartCameraInGallery:
                 intent = new Intent();
                 // 指定開啟系統相機的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, "系統相機拍照完成,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());
         }
     }
 }

這裡只是簡單的演示瞭如何呼叫系統現有的相機應用獲取拍攝的圖片,沒有做圖片資源的回收,所以可能會有記憶體溢位的錯誤,重新啟動應用即可。

==========================================視訊=====================================================
系統現有相機拍攝視訊

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

MediaStore.EXTRA_OUTPUT:設定媒體檔案的儲存路徑。
MediaStore.EXTRA_VIDEO_QUALITY:設定視訊錄製的質量,0為低質量,1為高質量。
MediaStore.EXTRA_DURATION_LIMIT:設定視訊最大允許錄製的時長,單位為毫秒。
MediaStore.EXTRA_SIZE_LIMIT:指定視訊最大允許的尺寸,單位為byte。
系統現有相機拍攝視訊Demo

  既然和拍攝照片的流程一樣,這裡就不再累述了,直接上Demo。在Demo中通過一個Button啟動一個系統現有相機拍攝視訊,最後儲存在SD卡上。

  實現程式碼:
 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);
     }
 
 }

總結

  到此就把如何使用系統現有相機應用拍攝照片與視訊都講解清楚了,在非相機相關的專案中,如果需要拍照的話,一般都是呼叫系統現有的相機應用,而不會直接呼叫Camera硬體去獲取影象。



Demo


相關推薦

android 呼叫 系統 相機 攝像機 拍照 視訊

主要內容如下:系統現有相機應用的呼叫 系統現有相機拍攝照片 獲取系統現有相機拍攝的圖片 系統現有相機拍攝圖片Demo 系統現有相機拍攝視訊 系統現有相機拍攝視訊Demo 系統現有相機應用的呼叫   對於如何呼叫系統現有應用,之前就有講解,這裡簡單再說一下。在開發的應用中呼叫

解決Android呼叫系統相機連續拍照出現的記憶體溢位問題

記憶體溢位相信做過程式設計的人都知道一二,這裡說Android 記憶體溢位的問題:、問題描述:Android下的相機在獨自使用時,拍照沒有問題,通過我們的程式碼呼叫時,也正常,但是更換了不同廠商的平板,ROM由Android4.0變成了Android4.1後,拍照出現了Out

Android 呼叫系統相機拍照,並上傳圖片所注意的一些問題

其實android拍照這個地方還是有很多注意事項的,我在上個專案中就遇到一些坑,因此我想把它記錄下來,希望能幫助一些跟我遇到的同樣的問題的人 如果你在專案中遇到以下問題: 通過系統路徑,拍出來的圖片不清楚 在某些情況下,onActivityResult

android呼叫系統相機實現拍照功能

在實現拍照的功能時遇到了很多問題,搜尋了很多資料,嘗試了很多辦法,終於解決了,下面簡要的描述下在開發過程中遇到的問題。 雖然之前看過android開發的書,但是沒有做過東西,這次也是臨時決定讓我做一個android採集系統的演示程式。拍照是其中一個功能,讓網搜尋了下拍照有兩

android 呼叫系統相機進行拍照及照片的裁切

呼叫系統相機進行拍照是android開發中常用到的功能,例如:拍照了直接發朋友圈等。還有常用的要進行圖片的裁剪,例如:上傳自己的頭像等。你又不能拍完照直接上傳,然後在讀取截止中間的,這樣不一定是使用者想要的部分。所以,我們通常是讓使用者自己按照我們的比例,來進行裁剪。這就

Android呼叫系統相機拍照,從相簿中選擇照片,呼叫系統攝像機錄影

最近在Android Studio上折騰程式碼,昨天編譯器又很不給面子的報錯了: Error type 3 Error: Activity class {com.example.myapplication/com.example.myapplication

android呼叫系統相機拍照

獲取縮圖 直接調取相機拍照,無需任何許可權,但是隻能獲取到縮圖 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivit

android 呼叫系統相機拍照,返回的data為null

最近做專案,需要拍照功能,於是就想簡單的呼叫系統相機來完成這一需求(當然,如果想要個性化一點的,也可以自定義camera去實現,這裡暫時不做)。 if(Environment.getExternalStorageState().equals(Environ

android 呼叫系統相機拍照後圖片上顯示文字

 先說說自己的思路(有什麼欠缺的望噴。。。)    1、在xml 檔案寫入Imageview(用來顯示拍照圖片) 和textview (顯示想要顯示的文字)  2、將xml 佈局通過   LayoutInflater.from(context).inflate轉換為view檢

解決Android呼叫系統相機拍照後相片無法在相簿中顯示問題

目前自己使用傳送廣播實現了效果public void photo() { Intent openCameraIntent = new Intent(android.provider.MediaSt

Android 呼叫系統相機拍照的返回結果

  1.開啟相機的Intent Action: MediaStore.ACTION_IMAGE_CAPTURE,下面為它的註釋: /** * Standard Intent action that can be sent to have the camera app

Android 呼叫系統相機拍照 . 選取本地相簿

專案中,基本都有使用者自定義頭像或自定義背景的功能,實現方法一般都是呼叫系統相機–拍照,或者系統相簿–選擇照片,然後進行剪裁,最終設為頭像或背景。 我直接貼上使用的程式碼吧! 這次偷懶了,沒有做效果圖,不過這是我試過的程式碼,可以,只不過不能選取原圖,因為

Android呼叫系統相機拍照 獲取原圖

拍照時候在onActivityResult中獲得相機拍照後點擊確定後的照片。 Android中用Intent提取縮圖和原始影象 可以接受照片的縮圖 Bundle bundle =data.ge

Android呼叫系統相機拍照並儲存到SD卡的兩種實現方式

1.呼叫照相機時通過putExtra的方式直接指定儲存路徑 String FilePath = "/sdcard/pic/"; File file = new File(FilePath); file.mkdirs();// 建立資料夾 Intent intent

總結Android呼叫系統相機拍照遇到的坑

拍照功能在應用開發中幾乎已成為標配,例如使用者通過拍照上傳頭像。實現拍照功能的方式有兩種。第一種是使用相機API(即Camera類)來自定義拍照,第二種是使用Intent呼叫系統相機來拍照。其中最常見的方式是直接呼叫系統相機拍照來獲取照片。 呼叫系統相機獲取照片的流程如下,

android 呼叫系統相機拍照的各種異常處理

1 本文只討論呼叫系統相機出現的異常解決辦法下面是呼叫系統相機的程式碼 先看一下最簡單的寫法 Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startAct

Android 呼叫系統相機拍照並且顯示在相簿中,以及中間可能會遇到的一些問題的解決

主要思路是在使用照相機拍照,然後為拍得的照片在SD卡新開一個儲存照片的檔案 程式碼:因為要呼叫照相機和SD卡所以需要新增以下許可權: 在manifests中新增 <uses-permission android:name="android.permission.CAM

Android-開啟系統相機拍照兩種顯示方式。

目標效果:      第二張為點選第一個按鈕拍照後顯示的,比較模糊,第三章為點選第二個按鈕拍照後顯示的,比較清楚。 1.activity_main.xml頁面設定佈局。 activity_main.xml頁面: <RelativeLayout xmlns:andro

Android呼叫系統相機

簡述:   Android開發中會經常遇到呼叫系統相機功能的場景,今天總結一下Camera的基本使用。                                                     技術點:     1、首先要考慮許可權問題,Android6.0

Android 呼叫系統相機回撥後的處理

宣告一個路徑: protected static String tempFileDic = Environment.getExternalStorageDirectory() + File.separator + Constant.PROJECT_