Cameraの使用(一)
14010 ワード
本節では、Androidではデフォルトの写真アプリではなく、カメラを起動し、画面を更新してプレビューを実現する機能を主に記録します.
AndroidManifest.xml:
CameraActivity.java:
CameraFragment.java:
AndroidManifest.xml:
<activity android:name=".CameraActivity" android:screenOrientation="portrait"/>
CameraActivity.java:
public class CameraActivity extends Activity implements mBaseUiFragment.OnUiFragmentJumpToListener {
CameraFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
// :
requestWindowFeature(Window.FEATURE_NO_TITLE);
// :
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_activity_layout);
initFragment();
}
private void initFragment(){
if (fragment == null){
fragment = new CameraFragment();
}
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.camera_framelayout, fragment, CameraFragment.FRAGMENT_TAG);
fragmentTransaction.commit();
}
@Override
public void jumpToFragment(Class<? extends Fragment> fragmentClass, String toFragmentTag) {
}
@Override
public void jumpToFragment(Class<? extends Fragment> fragmentClass, String toFragmentTag, Bundle args) {
}
@Override
public void fragmentBack() {
}
}
CameraFragment.java:
public class CameraFragment extends mBaseUiFragment{
static public String FRAGMENT_TAG = "CameraFragment";
private final static int REQUEST_DELETE_PHOTO = 1;
//
Camera mCamera;
//
private SurfaceHolder mSurfaceHolder;
//
private int switchCamera = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.camera_layout, null);
initView();
return rootView;
}
private void initView(){
SurfaceView mSurfaceView = (SurfaceView) rootView.findViewById(R.id.camera_surfaceView);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(
new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// SurfaceView , Camera Surface
try {
if (mCamera != null) {
mCamera.setPreviewDisplay(holder);
}
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// Surface , ,
if (mCamera == null) {
return;
}
Camera.Parameters parameters = mCamera.getParameters();
Camera.Size s = getBestSupportedSize(parameters.getSupportedPreviewSizes(), width, height);
parameters.setPreviewSize(s.width, s.height);
parameters.setPictureSize(s.width, s.height);
mCamera.setParameters(parameters);
mCamera.setDisplayOrientation(270);
try {
mCamera.startPreview();
} catch (Exception e) {
// TODO: handle exception
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// ,
if (mCamera != null) {
mCamera.stopPreview();
}
}
}
);
}
/******************************************]
*
*
*
* @param sizes
* @param width
* @param height
* @return
*/
public Camera.Size getBestSupportedSize(List<Camera.Size> sizes,int width,int height) {
Camera.Size bestSize = sizes.get(0);
int largestArea = bestSize.width*bestSize.height;
for (Camera.Size s :sizes) {
int area =s.width*s.height;
if (area > largestArea) {
bestSize=s;
largestArea = area;
}
}
return bestSize;
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("onPause");
// , Camera
if (mCamera!=null) {
mCamera.release();
mCamera=null;
}
}
@SuppressLint("NewApi")
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
// , Camera
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
mCamera = Camera.open(switchCamera);
}else {
mCamera = Camera.open();
}
}
}
Done