Pages

2015年9月23日 星期三

[android] record video

        在專案中要使用 android 的 camera 來實作錄影與拍照功能. 雖然網路上有許多範例但是還是會遇到一些問題.

以下是使用Camera 必備的 Activity 架構
public class MainActivity extends Activity implements SurfaceHolder.Callback{

    private SurfaceView surfaceview;
    private MediaRecorder mediarecorder;
    private SurfaceHolder surfaceHolder;
    private Button startButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...
    }

    @Override
    protected void onResume(){
        camera = Camera.open();
        if (phoneConfigure.orientation == Configuration.ORIENTATION_PORTRAIT)
            camera.setDisplayOrientation(90);
        super.onResume();
    }
 
    @Override
    protected void onPause(){
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        super.onPause();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
       Camera.Parameters parameters = camera.getParameters();
       parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); 
  
       camera.setParameters(parameters);
       camera.startPreview();
    }
 
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
 
      // TODO Auto-generated method stub
      try {
  
          camera.setPreviewDisplay(surfaceHolder);
   
      } catch (IOException e) {
          // TODO Auto-generated catch block
          camera.release();
          camera = null;
          e.printStackTrace();
      }
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
         // TODO Auto-generated method stub 
 
    }  

  
}

下面是錄影的相關重要程式碼

 public void startRecord(int videoWidth,int videoHeight){
 
 mediarecorder = new MediaRecorder();
  
 camera.stopPreview();  
 camera.unlock();
 mediarecorder.setCamera(camera);
 mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
 mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
 mediarecorder.setVideoSize(videoWidth,videoHeight);
 if (phoneConfigure.orientation == Configuration.ORIENTATION_PORTRAIT)
     mediarecorder.setOrientationHint(90);
 mediarecorder.setOutputFile(createVideoFilePath(fileExtention));
 mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());
  
 try {
     mediarecorder.prepare();
     mediarecorder.start(); 
 }catch (Exception e) {
     mediarecorder.stop();
     mediarecorder.release();
     e.printStackTrace();
     toast(e.getCause().toString());
 }
 }

 public void stopRecord(){
     if (mediarecorder != null) {
         mediarecorder.stop();
         mediarecorder.release();
         mediarecorder = null;
     }
 }
完整相關程式碼: Github

2015年9月8日 星期二

[android] external sdcard path 取得

 20171215:更新多種其他android手機SD path路徑方式
在 android 4.4版本之後 無法任意存取sd card的位置, 只能寫入與存取自己app 下的資料夾
 /Android/Data/<app-packagename>/
  ex: (/Android/Data/com.example.myapp/)

先利用 getExternalFilesDir(null);
可以自動在內部儲存空間和SD card創立 /Android/Data/<app-packagename>/ 資料夾

因為每個手機的sdcard 路徑都會不同
利用 System.getenv("SECONDARY_STORAGE"); 來取得sd card 的路徑 (ex, /storage/sdcard1/) 最後sdcard的路徑就可以寫成
getExternalFilesDir(null);
String path = System.getenv("SECONDARY_STORAGE") + "/Android/Data/com.example.myapp/";
android 6.0 SD card path
 private String androidMarshmallowSDcardPath() {
  String rootPath = null;
  File f = new File("/storage");
  if (f.isDirectory()) {
   String[] s = f.list();
   for (int i = 0; i < s.length; i++) {
    if(s[i].matches(".*-+.*")) {
     rootPath ="/storage/" + s[i];
     break;
    }else if(s[i].matches("exfat_uuid")) {// SONY Z3 SD card path name
     rootPath ="/storage/" + s[i];
     break;
    }
   }
  }
  return rootPath;
 }
如果把SD card 格式化成內部儲存空間,例如 HTC M8手機以上有支援此功能
SDcardPath = "/storage/emulated/0/Android/data/com.example.myapp/";
//SONY Xperia Miro
if(android.os.Build.MODEL.matches(".*ST23a+.*")) {
     SDcardPath = "/mnt/ext_card" +"/Android/data/com.phison.sdcardtest/";
}
相關permission
<uses-permission android:name="android.permissions.WRITE_EXTERNAL_STORAGE" />
 
 
Blogger Templates