㈠ 一個android程序,想實現調用系統相機拍照,然後存儲照片的功能,代碼如下。
多了括弧哦。
㈡ Android編程,求教一下,怎麼調用系統的相機後連續拍照
http://blog.csdn.net/iamdingruihaha/article/details/70158953
百分百解決
㈢ Android調用系統相機實現拍照和視頻錄制
(1)申請許可權
(2)設置布局
這里做了一個簡單的布局:添加了一個按鈕和一個ImageView控制項用於顯示拍攝的圖像。
(3)為按鈕添加點擊事件監聽
點擊按鈕時,調用系統相機進行拍照,並在確定後將圖像顯示在ImageView控制項中。
(1)申請許可權
(2)設置布局
添加了一個按鈕和一個VideoView控制項用於顯示錄制的視頻。
(3)為按鈕添加點擊事件監聽
同前面一樣,點擊按鈕後調用系統相機進行錄制視頻,錄制完成後點擊確定即可將錄制的視頻顯示在VideoView控制項中。
對於Android11.0的版本,在調用系統相近進行視頻錄制的時候,即使在AndroidMenifest.xml中申請了CAMERA許可權,還是會在程序運行時報錯: Permission Denial , . .... .... with revoked permission android.permission.CAMERA
解決方法是在程序中動態申請許可權:
寫在最後:文章是在學習過程中做的學習筆記,同時與志同道合者分享,文章內容均經過我自己實驗證實可行,如有問題歡迎留言,很高興一起交流討論,共同進步!
㈣ Android Camera2 教程 · 第一章 · 概覽
從 Android 5.0 開始,Google 引入了一套全新的相機框架 Camera2(android.hardware.camera2)並且廢棄了舊的相機框架 Camera1(android.hardware.Camera)。作為一個專門從事相機應用開發的開發者來說,這一刻我等了太久了,Camera1 那寥寥無幾的 API 和極差的靈活性早已不能滿足日益復雜的相機功能開發。Camera2 的出現給相機應用程序帶來了巨大的變革,因為它的目的是為了給應用層提供更多的相機控制許可權,從而構建出更高質量的相機應用程序。本文是 Camera2 教程的開篇作,本章將介紹以下幾個內容:
Camera2 的 API 模型被設計成一個 Pipeline(管道),它按順序處理每一幀的請求並返回請求結果給客戶端。下面這張來自官方的圖展示了 Pipeline 的工作流程,我們會通過一個簡單的例子詳細解釋這張圖。
為了解釋上面的示意圖,假設我們想要同時拍攝兩張不同尺寸的圖片,並且在拍攝的過程中閃光燈必須亮起來。整個拍攝流程如下:
一個新的 CaptureRequest 會被放入一個被稱作 Pending Request Queue 的隊列中等待被執行,當 In-Flight Capture Queue 隊列空閑的時候就會從 Pending Request Queue 獲取若干個待處理的 CaptureRequest,並且根據每一個 CaptureRequest 的配置進行 Capture 操作。最後我們從不同尺寸的 Surface 中獲取圖片數據並且還會得到一個包含了很多與本次拍照相關的信息的 CaptureResult,流程結束。
相機功能的強大與否和硬體息息相關,不同廠商對 Camera2 的支持程度也不同,所以 Camera2 定義了一個叫做 Supported Hardware Level 的重要概念,其作用是將不同設備上的 Camera2 根據功能的支持情況劃分成多個不同級別以便開發者能夠大概了解當前設備上 Camera2 的支持情況。截止到 Android P 為止,從低到高一共有 LEGACY、LIMITED、FULL 和 LEVEL_3 四個級別:
相機的所有操作和參數配置最終都是服務於圖像捕獲,例如對焦是為了讓某一個區域的圖像更加清晰,調節曝光補償是為了調節圖像的亮度。因此,在 Camera2 裡面所有的相機操作和參數配置都被抽象成 Capture(捕獲),所以不要簡單的把 Capture 直接理解成是拍照,因為 Capture 操作可能僅僅是為了讓預覽畫面更清晰而進行對焦而已。如果你熟悉 Camera1,那你可能會問 setFlashMode() 在哪? setFocusMode() 在哪? takePicture() 在哪?告訴你,它們都是通過 Capture 來實現的。
Capture 從執行方式上又被細分為【單次模式】、【多次模式】和【重復模式】三種,我們來一一解釋下:
CameraManager 是一個負責查詢和建立相機連接的系統服務,它的功能不多,這里列出幾個 CameraManager 的關鍵功能:
CameraCharacteristics 是一個只讀的相機信息提供者,其內部攜帶大量的相機信息,包括代表相機朝向的 LENS_FACING ;判斷閃光燈是否可用的 FLASH_INFO_AVAILABLE ;獲取所有可用 AE 模式的 CONTROL_AE_AVAILABLE_MODES 等等。如果你對 Camera1 比較熟悉,那麼 CameraCharacteristics 有點像 Camera1 的 Camera.CameraInfo 或者 Camera.Parameters 。
CameraDevice 代表當前連接的相機設備,它的職責有以下四個:
熟悉 Camera1 的人可能會說 CameraDevice 就是 Camera1 的 Camera 類,實則不是,Camera 類幾乎負責了所有相機的操作,而 CameraDevice 的功能則十分的單一,就是只負責建立相機連接的事務,而更加細化的相機操作則交給了稍後會介紹的 CameraCaptureSession。
Surface 是一塊用於填充圖像數據的內存空間,例如你可以使用 SurfaceView 的 Surface 接收每一幀預覽數據用於顯示預覽畫面,也可以使用 ImageReader 的 Surface 接收 JPEG 或 YUV 數據。每一個 Surface 都可以有自己的尺寸和數據格式,你可以從 CameraCharacteristics 獲取某一個數據格式支持的尺寸列表。
CameraCaptureSession 實際上就是配置了目標 Surface 的 Pipeline 實例,我們在使用相機功能之前必須先創建 CameraCaptureSession 實例。一個 CameraDevice 一次只能開啟一個 CameraCaptureSession,絕大部分的相機操作都是通過向 CameraCaptureSession 提交一個 Capture 請求實現的,例如拍照、連拍、設置閃光燈模式、觸摸對焦、顯示預覽畫面等等。
CaptureRequest 是向 CameraCaptureSession 提交 Capture 請求時的信息載體,其內部包括了本次 Capture 的參數配置和接收圖像數據的 Surface。CaptureRequest 可以配置的信息非常多,包括圖像格式、圖像解析度、感測器控制、閃光燈控制、3A 控制等等,可以說絕大部分的相機參數都是通過 CaptureRequest 配置的。值得注意的是每一個 CaptureRequest 表示一幀畫面的操作,這意味著你可以精確控制每一幀的 Capture 操作。
CaptureResult 是每一次 Capture 操作的結果,裡麵包括了很多狀態信息,包括閃光燈狀態、對焦狀態、時間戳等等。例如你可以在拍照完成的時候,通過 CaptureResult 獲取本次拍照時的對焦狀態和時間戳。需要注意的是,CaptureResult 並不包含任何圖像數據,前面我們在介紹 Surface 的時候說了,圖像數據都是從 Surface 獲取的。
如果要我給出強有力的理由解釋為什麼要使用 Camera2,那麼通過 Camera2 提供的高級特性可以構建出更加高質量的相機應用程序應該是最佳理由了。
如果你熟悉 Camera1,並且打算從 Camera1 遷移到 Camera2 的話,希望以下幾個建議可以對你起到幫助:
本章到此結束,主要是介紹了 Camera2 的一些基礎概念,讓大家能夠基本了解 Camera2 的工作流程和基礎概念,並且知道使用 Camera2 能夠做些什麼。如果你對 Camera2 還是感到很陌生,不要緊,後續的教程會帶領大家逐步深入了解 Camera2。
㈤ android 點擊即啟動照相機,怎麼實現
/**
* 調用相機拍照並存儲照片
*/
private void callCameraTakePhoto() {
Date currentDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINESE);
current_datetime = sdf.format(currentDate); // 初始化當前時間值
// 路徑規則:SD卡路徑(內部存儲)/packageName/no_upload_media/yyyyMMddHHmmss.jpg
photoName = current_datetime + ".jpg"; // 初始化圖片文件名
photoSavePath = PHOTO_FILE_PATH + File.separator + photoName; // 初始化文件夾位置
Log.e("path", photoSavePath);
init_pic_dir(PHOTO_FILE_PATH); // 查詢並創建文件夾
// 啟動相機並拍照
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(photoSavePath)));
startActivityForResult(intent, CALL_CAMERA);
}
建議:Android手機版本不一樣,調用手機底層方法也是不一樣的。同樣,手機牌子不一樣,也可能會導致調用手機底層方法不一樣。此方法在小米4.4-5.1是ok的。
㈥ Android 開發,調用相機的相關代碼
/**
* @Description 調用系統相機照相,獲取原圖像
* @param activity 就是你的mainactivity
* @param dir 拍照後保存在本地的圖片路徑
* @param filename 圖片的名稱
* @param cmd 返回的requestCode
* @return void
*/
public static boolean takePhoto(final Activity activity, final String dir,
final String filename, final int cmd) {
String filePath = dir + filename;
// final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Log.d("test", "MediaStore.ACTION_IMAGE_CAPTURE"
+ android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final Intent intent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE == null ? "android.media.action.IMAGE_CAPTURE"
: android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final File cameraDir = new File(dir);
if (!cameraDir.exists()) {
// return false;
cameraDir.mkdirs();
}
final File file = new File(filePath);
final Uri outputFileUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
try {
activity.startActivityForResult(intent, cmd);
} catch (final ActivityNotFoundException e) {
return false;
}
return true;
}
然後在你的onactivityforresult方法里寫:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PHOTOGRAPH://拍照
if (resultCode == RESULT_OK) {
String url = FileHelper.Get_SDCardPath() + Constant.HHXH_IMGDIR
+ BitmapUtil.tempPhoto;//圖片路徑,和你前面調用相冊時設的路徑一樣
Bitmap bitmap = BitmapUtil
.extractThumbNail(url, 480, 320, true);//這里是根據本地路徑獲取圖片並壓縮的,這個我寫的代碼比較多就不上傳了
findviewbyid(R.id.imgPhoto).setImageBitmap(bitmap);
}
}
}
㈦ android studio怎麼調用相機
android 調用系統相機解決方法:直接通過Intent調用系統相機
直接調用系統的相機應用,只需要在Intent對象中傳入相應的參數即可,總體來說需要以下三步:
1. Compose a Camera Intent
MediaStore.ACTION_IMAGE_CAPTURE 拍照;
MediaStore.ACTION_VIDEO_CAPTURE錄像。
2. Start the Camera Intent
使用startActivityForResult()方法,並傳入上面的intent對象。
之後,系統自帶的相機應用就會啟動,用戶就可以用它來拍照或者錄像。
3. Receive the Intent Result
用onActivityResult()接收傳回的圖像,當用戶拍完照片或者錄像,或者取消後,系統都會調用這個函數。
㈧ android 自定義相機 變焦問題 的代碼實現
我見過其他的幾個問題關於這個問題但都不能解決我的問題。我有一個自定義相機應用程序,做工精細,一切,但縮放按鈕。這是我使用 SDK min 8 目標 14 的代碼:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (isPreviewing){
camera.stopPreview();
}
Camera.Parameters p = camera.getParameters();
p.setPreviewSize(sizes.get(0).width, sizes.get(0).height);
p.setColorEffect(effect);
zoomControls = (ZoomControls) findViewById(R.id.zoomControls);
if (p.isZoomSupported()) {
maxZoomLevel = p.getMaxZoom();
Toast.makeText(PictureTaker.this, String.valueOf(maxZoomLevel),Toast.LENGTH_LONG).show();
zoomControls.setIsZoomInEnabled(true);
zoomControls.setIsZoomOutEnabled(true);
zoomControls.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View v) {
if (currentZoomLevel < maxZoomLevel) {
currentZoomLevel++;
camera.startSmoothZoom(currentZoomLevel);
//Toast.makeText(PictureTaker.this, String.valueOf(currentZoomLevel),Toast.LENGTH_LONG).show();
}
}
});
zoomControls.setOnZoomOutClickListener(new OnClickListener() {
public void onClick(View v) {
if (currentZoomLevel > 0) {
currentZoomLevel--;
camera.startSmoothZoom(currentZoomLevel);
}
}
});
} else {
zoomControls.setVisibility(View.GONE);
}
camera.setParameters(p);
try {
camera.setPreviewDisplay(holder);
} // end try
catch (IOException e) {
Log.v(TAG, e.toString());
} // end catch
camera.startPreview(); // begin the preview
isPreviewing = true;
}
SetColorEffect 從選項菜單來,十分管用。我知道 isZoomSupported 和 getMaxZoom 的工作,因為烤麵包機顯示"59",當代碼運行時,但什麼都不做縮放按鈕。這是從 XML 俯仰
<ZoomControls
android:id="@+id/zoomControls"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="17dp"
android:baselineAligned="false"
android:gravity="center_horizontal"
android:orientation="horizontal" />
我有所有必要的許可權在清單中,在 LogCat 中顯示沒有錯誤。不知道我做錯了。我舉杯,第二如果添加到報告 currentZoomLevel 正在更改時按下的按鈕,它顯示的值獲取遞增一每個時間。我也嘗試不使用 startSmoothZoom 和只設置與縮放
p.setZoom(currentZoomLevel); or p.setZoomLevel(15);
和既不一個工程也。我的手機 HTC 不可思議不會有完美工作變焦在其本機攝像頭應用程序上。如果我注釋掉的代碼俯仰部分,一切工作罰款和所有其他功能的自定義照相機工作正常甚至用在那裡的俯仰代碼,它只是不會放大。