第二种方法,利用Camera API进行调用照相机
1.首先需要添加权限:
<uses-permission android:name=”android.permission.CAMERA”>
2.运行结果,图片旋转了90度,需要在ACTIVITY的onCreate的当下旋转Activity的方向:
This.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
package com.cameraapi;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.hardware.Camera.Size;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.media.CameraProfile;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.Menu;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
publicclass MainActivity extends Activity implements SurfaceHolder.Callback{//
publicstaticfinalintMEDIA_TYPE_IMAGE = 1;
publicstaticfinalintMEDIA_TYPE_VIDEO = 2;
private Camera mCamera01;
private Button mButton01, mButton02, mButton03;//, mButton04
private SurfaceView mSurfaceView01;
private SurfaceHolder mSurfaceHolder01;
privatebooleanbIfPreview = false;
privatebooleanrecord_stop = true;
private MediaRecorder mRecorder01;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置窗口模式标题、全屏等性质
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);// 设置全屏 .FLAG_FULLSCREEN
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().setFormat(PixelFormat.JPEG);
setContentView(R.layout.activity_main);
init_msys();// 初始化各种控件、参数
}
privatevoid init_msys() {
mButton01 = (Button)findViewById(R.id.button1);// START/STOP
mButton02 = (Button)findViewById(R.id.button2);//FINISH
mButton03 = (Button)findViewById(R.id.button3);//transmit
//设定按钮监听函数
mButton01.setOnClickListener(new myButtonClickListener());
mButton02.setOnClickListener(new myButtonClickListener());
mButton03.setEnabled(false);
mSurfaceView01 = (SurfaceView) findViewById(R.id.surfaceView1);
mSurfaceHolder01 = mSurfaceView01.getHolder();// 获取 holder
mSurfaceHolder01.addCallback(this); //加入回调接口
mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
class myButtonClickListener implements OnClickListener{
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
//开始和停止 录像按钮
if(v == mButton01)
{
if(record_stop){
init_camera();
mButton01.setText("停止");
record_stop=false;
}else
{
stop_camera();
mButton01.setText("开始");
record_stop=true;
}
}
//按结束按钮,退出摄像机
if(v== mButton02){
finish();
}
}
}
privatevoid init_camera()
{if(!bIfPreview)
{
// mCamera01 = Camera.open();
if(mCamera01 == null)
Toast.makeText(MainActivity.this, "没有打开摄像头", Toast.LENGTH_SHORT).show();
else
Toast.makeText(MainActivity.this, "打开了摄像头", Toast.LENGTH_SHORT).show();
Camera.Parameters params = mCamera01.getParameters();
List<Size> sizes = params.getSupportedPictureSizes();
for (Size size : sizes) {
Toast.makeText(MainActivity.this, "\r\n w:"+size.width+";h:"+size.height, Toast.LENGTH_SHORT).show();
//et.append("\r\n w:"+size.width+";h:"+size.height);
}
mCamera01.stopPreview();
mCamera01.unlock();
mRecorder01 = new MediaRecorder();// 创建mRecorder对象
mRecorder01.setCamera(mCamera01);// 设置录制视频源为Camera(相机)
mRecorder01.setVideoSource(MediaRecorder.VideoSource.CAMERA); //.DEFAULT
mRecorder01.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//MediaRecorder.AudioSource.MIC
mRecorder01.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
// mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置录制的视频编码h263 h264
//mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
//mediarecorder.setVideoSize(352, 288);
// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
//mediarecorder.setVideoFrameRate(15);
mRecorder01.setPreviewDisplay(mSurfaceHolder01.getSurface());
mRecorder01.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
try {
// 准备录制
mRecorder01.prepare();
// 开始录制
mRecorder01.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bIfPreview = true;
}
}
privatestatic File getOutputMediaFile(int type){
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM), "mypictures");
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("mypictures", "failed to create directory");
returnnull;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} elseif(type == MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_"+ timeStamp + ".mp4");
} else {
returnnull;
}
return mediaFile;
}
privatevoid stop_camera(){
bIfPreview = false;
if (mRecorder01 != null){
mRecorder01.stop();
mRecorder01.reset();
mRecorder01.release();
mRecorder01 = null;
mCamera01.lock();
}
}
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}
@Override
publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
publicvoid surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mSurfaceHolder01 = holder;
if(null == mCamera01)
mCamera01 = Camera.open();
}
@Override
publicvoid surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
stop_camera();
mCamera01.stopPreview();
mCamera01.release();
mCamera01 = null;
// mCamera01.release();
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="301dp"
android:layout_height="250dp"
android:layout_gravity="center_horizontal" />
<RelativeLayout
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:text="录像" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button1"
android:text="连接" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button3"
android:text="远程" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button4"
android:text="退出" />
</RelativeLayout>
</LinearLayout>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cameraapi"
android:versionCode="1"
android:versionName="1.0" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.cameraapi.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
</manifest>
相关推荐
标题“照相机---调用”指的是在编程领域中如何通过代码来调用设备的照相机功能,这通常涉及到移动应用开发,尤其是Android或iOS平台。在这个话题中,开发者需要了解如何与操作系统进行交互,以便在应用程序中集成...
1. **调用WinAPI函数**:VB通过声明并使用WinAPI函数来实现屏幕捕获。例如,`GetDesktopWindow()`函数获取桌面窗口的句柄,`GetWindowDC()`函数获取该窗口的设备上下文(Device Context, DC),这是屏幕图像的基础。...
对于Android平台,Qt提供了与原生系统功能交互的能力,例如调用安卓照相机。本文将深入探讨如何在Qt应用中实现这一功能,涉及的技术包括摄像、打开相册、拍照以及播放摄像视频。 首先,我们需要理解Qt是如何在...
PhoneGap调用Android手机照相机是一项常见的移动应用开发任务,主要涉及到PhoneGap框架与Android原生API的交互。PhoneGap是一种跨平台的移动应用开发工具,它允许开发者使用HTML、CSS和JavaScript来构建应用程序,...
3. 照相机控制:VB.NET语言可以通过调用avicap32.dll中的函数来控制照相机,例如设置视频捕获格式、设置预览率等。 4. 照相机预览:VB.NET语言可以通过调用avicap32.dll中的函数来实现照相机预览,例如设置预览窗口...
iOS中,`UIImageJPEGRepresentation()`函数允许指定质量参数。 - **尺寸压缩**:减小图片的宽度和高度。Android的`Bitmap.createScaledBitmap()`和iOS的`CGImage.create(with:)`可实现这一目标。 5. **优化压缩...
在ubuntu18.04系统;利用V4L2采集两个usb摄像头数据,在QT上控件显示两个采集的视频流。可以同时采集两个相机。 在QT下调用V4L2的库函数来实现采集视频流。并且把采集到的视频流在控件上显示出来。...
首先,我们需要引入必要的命名空间,如`System.Runtime.InteropServices`,用于P/Invoke(Platform Invoke)技术,这是.NET Framework提供的一个特性,允许C#代码调用非托管(通常为C或C++编写的)DLL中的函数。...
开发者需要学习如何调用这些函数来执行如开启/关闭相机、设置曝光参数、触发快门等操作。 其次,示例代码是学习如何使用EDSDK的重要资源。这些示例通常涵盖了基本的相机控制功能,例如连接相机、获取相机信息、拍摄...
一款迷你小巧的实用软件,主要运用文件读写,美化皮肤、还调用了API函数,附带照相机、截图等源码,使用dll文件加载多方控件等等……
在Android应用开发中,调用系统照相机是一项常见的功能,用户可以方便地拍摄照片并集成到应用程序中。本文将详细讲解如何实现这一功能,包括如何启动系统照相机、处理拍照后的回调、显示照片以及保存图片。 1. **...
在Android开发中,调用系统照相机功能并与应用进行交互是一项常见的需求。用户拍摄照片后,我们通常需要将照片保存到本地,并可能将其转化为字符串形式以便在网络上传输或存储。以下将详细介绍如何实现这一功能。 ...
2. **添加`TAndroidCamera`组件**:在你的Delphi 10.2 Form设计界面,从组件面板中找到`TAndroidCamera`并将其拖放到表单上。配置该组件的属性,例如`Active`(是否启用摄像头)、`CaptureMode`(捕获模式,如图片或...
在Android开发中,调用系统照相机进行拍照和录像是一项基础且重要的功能。开发者通常需要实现应用直接启动设备上的照相机应用进行照片或视频的捕捉。本文将会详细地介绍如何实现这一功能。 首先,要调用系统照相机...
例如,可以定义一个方法如`SelectAndCropImage(string callback)`,其中callback参数用于传递Unity中接收图片数据的回调函数名。 - 在iOS原生代码中,实现UnitySendMessage方法,接收到Unity的调用后启动...
2. **Intent用于打开相册**: Delphi FMX(FireMonkey)提供了`TIntent`类来与Android系统服务交互。要调用相册,你可以创建一个`ACTION_PICK`类型的Intent,如下: ```delphi var Intent: JIntent; begin ...
通过调用`navigator.mediaDevices.getUserMedia`方法,我们可以请求访问用户的摄像头。一旦用户同意,我们就能将摄像头的实时视频流展示在`<video>`元素中,模拟照相机的预览功能。 接着,Canvas元素是实现照片拍摄...
而`调用系统相册和系统照相机功能雨实例源码`文件则包含了具体的Java或Kotlin代码,供开发者研究和学习。 总之,这个实例源码是关于如何在Android应用中调用系统相册和相机功能的实践示例,涵盖了Intent使用、结果...