Android Camera API 使用指南
【原文:http://www.open-open.com/lib/view/open1327491133296.html】
本教程介紹如何使用Android API中的攝像頭。本教程是基於Eclipse的3.7,JAVA1.6和Android4.0。
目錄
Most Android devices have a camera. Some devices have a front and a back camera.
Using the camera on the Android device can be done via integration of the existing Camera application. In this case you would start the existing Camera application via an Intent
and
to get the data after the user returns to our application.
You can also directly integrate the camera into your application via the Camera
API.
01 |
package de.vogella.android.imagepick; |
02 |
03 |
import java.io.FileNotFoundException; |
04 |
import java.io.IOException; |
05 |
import java.io.InputStream; |
06 |
07 |
import android.app.Activity; |
08 |
import android.content.Intent; |
09 |
import android.graphics.Bitmap; |
10 |
import android.graphics.BitmapFactory; |
11 |
import android.os.Bundle; |
12 |
import android.view.View; |
13 |
import android.widget.ImageView; |
14 |
15 |
public class ImagePickActivity extends Activity
{ |
16 |
private static final int REQUEST_CODE
= 1 ; |
17 |
private Bitmap
bitmap; |
18 |
private ImageView
imageView; |
19 |
20 |
|
21 |
/**
Called when the activity is first created. */ |
22 |
23 |
@Override |
24 |
public void onCreate(Bundle
savedInstanceState) { |
25 |
super .onCreate(savedInstanceState); |
26 |
setContentView(R.layout.main); |
27 |
imageView
= (ImageView) findViewById(R.id.result); |
28 |
} |
29 |
30 |
public void pickImage(View
View) { |
31 |
Intent
intent = new Intent(); |
32 |
intent.setType( "image/*" ); |
33 |
intent.setAction(Intent.ACTION_GET_CONTENT); |
34 |
intent.addCategory(Intent.CATEGORY_OPENABLE); |
35 |
startActivityForResult(intent,
REQUEST_CODE); |
36 |
} |
37 |
38 |
@Override |
39 |
protected void onActivityResult( int requestCode, int resultCode,
Intent data) { |
40 |
if (requestCode
== REQUEST_CODE && resultCode == Activity.RESULT_OK) |
41 |
try { |
42 |
//
We need to recyle unused bitmaps |
43 |
if (bitmap
!= null )
{ |
44 |
bitmap.recycle(); |
45 |
} |
46 |
InputStream
stream = getContentResolver().openInputStream( |
47 |
data.getData()); |
48 |
bitmap
= BitmapFactory.decodeStream(stream); |
49 |
stream.close(); |
50 |
imageView.setImageBitmap(bitmap); |
51 |
} catch (FileNotFoundException
e) { |
52 |
e.printStackTrace(); |
53 |
} catch (IOException
e) { |
54 |
e.printStackTrace(); |
55 |
} |
56 |
super .onActivityResult(requestCode,
resultCode, data); |
57 |
} |
58 |
} |
3. Tutorial: Using the camera API
In this example we will an application which allow to make a photo via the front camera and to save it on the SD card. If you using the Android emulator make sure you added space for the SD card during the creation of the your Android virtual device.
Create a new Android project de.vogella.camera.api
with an Activity
called MakePhotoActivity
.
Add the android.permission.CAMERA
permission to access your camera and theandroid.permission.WRITE_EXTERNAL_STORAGE
to
be able to write to the SD card to your AndroidManifest.xml file.
01 |
<? xml version = "1.0" encoding = "utf-8" ?> |
02 |
< manifest xmlns:android = "http://schemas.android.com/apk/res/android" |
03 |
package = "de.vogella.cameara.api" |
04 |
android:versionCode = "1" |
05 |
android:versionName = "1.0" > |
06 |
07 |
< uses-sdk android:minSdkVersion = "15" /> |
08 |
< uses-permission android:name = "android.permission.CAMERA" /> |
09 |
< uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" /> |
10 |
11 |
< application |
12 |
android:icon = "@drawable/ic_launcher" |
13 |
android:label = "@string/app_name" > |
14 |
< activity |
15 |
android:name = "de.vogella.camera.api.MakePhotoActivity" |
16 |
android:label = "@string/app_name" > |
17 |
< intent-filter > |
18 |
< action android:name = "android.intent.action.MAIN" /> |
19 |
20 |
< category android:name = "android.intent.category.LAUNCHER" /> |
21 |
</ intent-filter > |
22 |
</ activity > |
23 |
</ application > |
24 |
25 |
</ manifest > |
26 |
|
01 |
<? xml version = "1.0" encoding = "utf-8" ?> |
02 |
< RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" |
03 |
android:layout_width = "match_parent" |
04 |
android:layout_height = "match_parent" > |
05 |
06 |
< Button |
07 |
android:id = "@+id/captureFront" |
08 |
android:layout_width = "wrap_content" |
09 |
android:layout_height = "wrap_content" |
10 |
android:layout_centerInParent = "true" |
11 |
android:onClick = "onClick" |
12 |
android:text = "Make
Photo" /> |
13 |
14 |
</ RelativeLayout > |
PhotoHandler
class which will be responsible for saving the photo the the SD card.
01 |
package de.vogella.camera.api; |
02 |
03 |
import java.io.File; |
04 |
import java.io.FileOutputStream; |
05 |
import java.text.SimpleDateFormat; |
06 |
import java.util.Date; |
07 |
08 |
import android.content.Context; |
09 |
import android.hardware.Camera; |
10 |
import android.hardware.Camera.PictureCallback; |
11 |
import android.os.Environment; |
12 |
import android.util.Log; |
13 |
import android.widget.Toast; |
14 |
15 |
public class PhotoHandler implements PictureCallback
{ |
16 |
17 |
private final Context
context; |
18 |
19 |
public PhotoHandler(Context
context) { |
20 |
this .context
= context; |
21 |
} |
22 |
23 |
@Override |
24 |
public void onPictureTaken( byte []
data, Camera camera) { |
25 |
26 |
File
pictureFileDir = getDir(); |
27 |
28 |
if (!pictureFileDir.exists()
&& !pictureFileDir.mkdirs()) { |
29 |
30 |
Log.d(Constants.DEBUG_TAG, "Can't
create directory to save image." ); |
31 |
Toast.makeText(context, "Can't
create directory to save image." , |
32 |
Toast.LENGTH_LONG).show(); |
33 |
return ; |
34 |
35 |
} |
36 |
37 |
SimpleDateFormat
dateFormat = new SimpleDateFormat( "yyyymmddhhmmss" ); |
38 |
String
date = dateFormat.format( new Date()); |
39 |
String
photoFile = "Picture_" +
date + ".jpg" ; |
40 |
41 |
String
filename = pictureFileDir.getPath() + File.separator + photoFile; |
42 |
43 |
File
pictureFile = new File(filename); |
44 |
45 |
try { |
46 |
FileOutputStream
fos = new FileOutputStream(pictureFile); |
47 |
fos.write(data); |
48 |
fos.close(); |
49 |
Toast.makeText(context, "New
Image saved:" +
photoFile, |
50 |
Toast.LENGTH_LONG).show(); |
51 |
} catch (Exception
error) { |
52 |
Log.d(Constants.DEBUG_TAG, "File" +
filename + "not
saved: " |
53 |
+
error.getMessage()); |
54 |
Toast.makeText(context, "Image
could not be saved." , |
55 |
Toast.LENGTH_LONG).show(); |
56 |
} |
57 |
} |
58 |
59 |
private File
getDir() { |
60 |
File
sdDir = Environment |
61 |
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); |
62 |
return new File(sdDir, "CameraAPIDemo" ); |
63 |
} |
64 |
} |
MakePhotoActivity
class to the following.
01 |
package de.vogella.camera.api; |
02 |
03 |
import android.app.Activity; |
04 |
import android.content.pm.PackageManager; |
05 |
import android.hardware.Camera; |
06 |
import android.hardware.Camera.CameraInfo; |
07 |
import android.os.Bundle; |
08 |
import android.util.Log; |
09 |
import android.view.View; |
10 |
import android.widget.Toast; |
11 |
import de.vogella.cameara.api.R; |
12 |
13 |
public class MakePhotoActivity extends Activity
{ |
14 |
private final static String
DEBUG_TAG = "MakePhotoActivity" ; |
15 |
private Camera
camera; |
16 |
private int cameraId
= 0 ; |
17 |
18 |
@Override |
19 |
public void onCreate(Bundle
savedInstanceState) { |
20 |
super .onCreate(savedInstanceState); |
21 |
setContentView(R.layout.main); |
22 |
23 |
//
do we have a camera? |
24 |
if (!getPackageManager() |
25 |
.hasSystemFeature(PackageManager.FEATURE_CAMERA))
{ |
26 |
Toast.makeText( this , "No
camera on this device" ,
Toast.LENGTH_LONG) |
27 |
.show(); |
28 |
} else { |
29 |
cameraId
= findFrontFacingCamera(); |
30 |
camera
= Camera.open(cameraId); |
31 |
if (cameraId
< 0 )
{ |
32 |
Toast.makeText( this , "No
front facing camera found." , |
33 |
Toast.LENGTH_LONG).show(); |
34 |
} |
35 |
} |
36 |
} |
37 |
38 |
public void onClick(View
view) { |
39 |
camera.takePicture( null , null , |
40 |
new PhotoHandler(getApplicationContext())); |
41 |
} |
42 |
43 |
private int findFrontFacingCamera()
{ |
44 |
int cameraId
= - 1 ; |
45 |
//
Search for the front facing camera |
46 |
int numberOfCameras
= Camera.getNumberOfCameras(); |
47 |
for ( int i
= 0 ;
i < numberOfCameras; i++) { |
48 |
CameraInfo
info = new CameraInfo(); |
49 |
Camera.getCameraInfo(i,
info); |
50 |
if (info.facing
== CameraInfo.CAMERA_FACING_FRONT) { |
51 |
Log.d(DEBUG_TAG, "Camera
found" ); |
52 |
cameraId
= i; |
53 |
break ; |
54 |
} |
55 |
} |
56 |
return cameraId; |
57 |
} |
58 |
59 |
@Override |
60 |
protected void onPause()
{ |
61 |
if (camera
!= null )
{ |
62 |
camera.release(); |
63 |
camera
= null ; |
64 |
} |
65 |
super .onPause(); |
66 |
} |
67 |
68 |
} |
5. Questions and Discussion
Before posting questions, please see the vogella FAQ. If you have questions or find an error in this article please use the www.vogella.de Google Group. I have created a short list how to create good questions which might also help you.
Eclipse RCP Training (German) Eclipse RCP Training with Lars Vogel
Android Tutorial Introduction to Android Programming
GWT Tutorial Program in Java and compile to JavaScript and HTML
Eclipse RCP Tutorial Create native applications in Java
JUnit Tutorial Test your application
Git Tutorial Put everything you have under distributed version control system
相關文章
- Android Camera 系列(二)控制CameraAndroid
- Android Camera——拍照Android
- Android音視訊(一) Camera2 API採集資料AndroidAPI
- Android Camera開發指南Android
- Sentinel GO API 使用指南GoAPI
- Android Camera瞭解一下Android
- Android Studio 呼叫Camera實現拍照功能Android
- Android camera2實現預覽Android
- Android中WebView的使用指南:AndroidWebView
- Android多媒體之Camera的相關操作Android
- Android Camera 程式設計從入門到精通Android程式設計
- Android APIAndroidAPI
- Android 動畫 Animator 家族使用指南Android動畫
- Android使用Camera2獲取預覽資料Android
- Android多媒體之Camera2的相關操作Android
- 基於Android5.0的Camera Framework原始碼分析 (三)AndroidFramework原始碼
- Android音視訊(六) 使用OpenGL ES 3.0預覽CameraAndroid
- 開源相機管理庫Aravis例程學習(五)——camera-apiAPI
- Android Camera2獲取預覽尺寸和fps範圍Android
- Camera(一)
- 13.4 camera
- Android 使用graphics.Camera類實現自定義旋轉飄落Android
- Android中文API(129) —— AudioManagerAndroidAPI
- Android中文API(137) —— LocalSocketAndroidAPI
- 【譯】Android API 規範AndroidAPI
- Android API相容,其他API,UI適配(2)AndroidAPIUI
- Android API相容,其他API,UI適配(3)AndroidAPIUI
- Android Camera 開發你該知道的祕密㊙️-新手入門必備Android
- Android API相容,其他API,UI適配(------ 分割線 -----)AndroidAPIUI
- Camera EEPROM bringup
- Camera Actuator bringup
- Adobe Camera Raw
- 【譯】Android NDK API 規範AndroidAPI
- Android各版本對應Android API(知識累積)AndroidAPI
- Camera Sensor介面配置
- Camera List Record - 120
- Android Gradle 依賴配置:implementation & apiAndroidGradleAPI
- Android實現模組 api 化AndroidAPI
- 【Camera專題】Qcom-你應該掌握的Camera基礎一