相機概述:
Android框架支持通過Camera API 或者Camera intent來抓取圖像和視頻
Camera 此類是控制設備相機的主要API,此類用于創(chuàng)建相機應用時獲取圖片和視頻
SurfaceView 此類為用戶提供camera的實時圖像預覽
MediaRecorder 此類用于從camera錄制視頻
Intent 一個MediaStore.ACTION_IMAGE_CAPTUREMediaStore.ACTION_VIDEO_CAPTURE的intent,可以使用它來抓取圖像或者視頻,而不能操作Camera對象
CameraPermission 你的應用必須請求使用設備相機的權限
<uses-permission android:name="android.permission.CAMERA"/>
-
CameraFeatures 你的應用必須也要聲明要使用的相機特性
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--在使用視頻捕獲設備來錄制視頻的時候,你的應用必須有一下的權限--> <uses-permission android:name="android.permission.RECORD_AUDIO"/> 使用現(xiàn)有的相機應用
一個不用寫代碼來獲取圖片和視頻的快速方法是使用intent來調用現(xiàn)有的android camera應用,一個camera intent調用現(xiàn)存的相機應用抓取圖片
或者視頻剪輯然后返回你的應用調用一個相機的intent 主要有一下的步奏
(1)組件一個相機intent 創(chuàng)建一個請求圖片或者視頻的intent 使用以下intent類型中的一個
MediaStore.ACTION_IMAGE_CAPTURE從已存在的相機應用中請求一個圖片
MediaStore.ACTION_VIDEO_CAPTURE,從已存在的相機應用中請求一個視頻
(2)啟動這個相機的intent,使用startActivityForResult()方法來執(zhí)行相機intent,在你啟動intent后,相機應用的界面會出現(xiàn)在設備屏幕上,然后用戶就可以yoga他來獲取圖片和視頻
(3)接收intent結果,在你的應用中設置一個onActivityResult()方法來接收從相機intent來的回調和數(shù)據(jù),當用戶獲取了一個圖片或者視頻之后(或者取消了操作)系統(tǒng)就會調用此方法。
圖像或者intent
private static final int MEDIA_TYPE_IMAGE = 1;
private static final int MEDIA_TYPE_VIDEO = 2;
public static Uri getOutputMediaFileUri(int type) {
return Uri.fromFile(getOutputMediaFile(type));
}
private static File getOutputMediaFile(int type) {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyCameraApp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File medifFile = null;
if (type == MEDIA_TYPE_IMAGE) {
medifFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
} else if (type == MEDIA_TYPE_VIDEO) {
medifFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".avi");
} else {
return null;
}
return medifFile;
}
- 當startActivityForResult()方法被執(zhí)行,看到一個相機應用的界面
當用戶獲取了一個圖像(或者取消了操作)用戶界面返回到你的應用
你必須攔截onActivityResult()方法來接收intent的結果然后在繼續(xù)執(zhí)行你的應用
/**
* 拍照的方法
*/
private void imageCamera() {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getOutputMediaFileUri(MEDIA_TYPE_IMAGE));
startActivityForResult(intent, MEDIA_TYPE_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case RESULT_OK:
//圖片
if (MEDIA_TYPE_IMAGE == requestCode) {
Log.d("CameryActivity", "mFile:" + mFile);
} else if (MEDIA_TYPE_VIDEO == requestCode) {
//視頻
}
break;
}
}
- 視頻獲取inten
使用相機intent獲取視頻是使用最少代碼使得你的應用獲取視屏的捷徑
一個視頻獲取intent可以包含以下額外的信息 - (1)MediaStore.EXTRA_OUTPUT此設置需要一個保存視頻的路徑和文件名的Uri,此設置是可選的但強烈推薦,如果你不指定此值,相機應用就把請求到的圖像以默認的文件名保存到默認的文件夾下,這些信息保存在返回的intent的Intent.getData()字段中
- (2)MediaStore.EXTRA_VIDEO_QUALITY 此值在最低質量最小文件尺寸時是0,在最高質量最大文件尺寸時是1
- (3)MediaStore.EXTRA_DURATION_LIMIT 此值設置獲取視屏的長度,以秒為單位
- (4)MediaStore.EXTRA_SIZE_LIMIT 此值設置獲取視屏文件的大小,以字節(jié)為單位
/**
* 錄視頻
*/
private void videoCamera() {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getOutputMediaFileUri(MEDIA_TYPE_VIDEO));
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); //設置視頻質量
startActivityForResult(intent, MEDIA_TYPE_VIDEO);
}
-
音頻錄制步奏:
android為我們提供了android.media.MediaRecorder類用于音頻的錄制。 1、創(chuàng)建android.media.MediaRecorder實例
2、設置音源MediaRecorder.setAudioSource(),通過可以是MediaRecorder.AudioSource.MIC
3、設置輸出文件的格式 MediaRecorder.setOutputFormat()\
4、設置輸出文件 MediaRecorder.setOutputFile()
5、設置音頻編碼 MediaRecorder.setAudioEncoder()
6、設置MediaRecorder.prepare()
7、調用MediaRecorder.start()開始錄制
8、調用MediaRecorder.stop()停止錄制
9、完成或者結束錄制調用MediaRecorder.release()來釋放資源
錄音代碼:
public class RecodeActivity extends AppCompatActivity implements View.OnClickListener, MediaRecorder.OnErrorListener {
private Button startRecord;
private Button stopRecord;
private MediaRecorder mRecorder;
private boolean prepared = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recode);
mRecorder = new MediaRecorder();
initialize();
}
private void initialize() {
startRecord = (Button) findViewById(R.id.startRecord);
startRecord.setOnClickListener(this);
stopRecord = (Button) findViewById(R.id.stopRecord);
stopRecord.setOnClickListener(this);
initRecord();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.startRecord:
startRecord();
break;
case R.id.stopRecord:
stopRecord();
break;
}
}
/**
* 初始化錄音的準備工作
*/
private void initRecord() {
mRecorder.reset();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //設置音源
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //設置輸出格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //設置音頻的編碼格式
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator + System.currentTimeMillis() + ".mp3";
mRecorder.setOutputFile(path); //設置輸出文件夾
try {
mRecorder.prepare();
prepared = true;
} catch (IOException e) {
e.printStackTrace();
}
stopRecord.setEnabled(false);
}
/**
* 停止錄音
*/
private void stopRecord() {
if (prepared) {
mRecorder.start();
stopRecord.setEnabled(true);
startRecord.setEnabled(false);
prepared = false;
}
}
/**
* 開始錄音
*/
private void startRecord() {
mRecorder.stop();
stopRecord.setEnabled(false);
startRecord.setEnabled(true);
}
@Override
public void onError(MediaRecorder mr, int what, int extra) {
mRecorder.reset();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mRecorder != null) {
mRecorder.release();
}
}
}
WebView的參數(shù)設置:
- 加載網頁
- 加載本地
- post方式傳遞參數(shù)
String postData = "clientID = cid & usernaem = name";
webView.postUrl(String url,byte[]postData) //加載網頁使用post方法,
//使用loadData()方法來加載html的數(shù)據(jù)
loadData()方法需要三個參數(shù):HTML TAG,MIME類型(text/html,網頁編碼方式(utf-8)
wv.loadData(content,"text/html","utf-8");