相機概述

相機概述:

  • 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");
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容