1.如何启动摄像头
调用系统隐式意图,若只有内置相机app则立即调用,若有多个相机app则弹出选择菜单。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent);
2.如何使我们的应用捕获ACTION_IMAGE_CAPTURE意图。
<activity android:name="tr.nuctech.com.tr0100.Activity.CameraActivity" android:label="@string/title_activity_camera" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>3.如何使用系统摄像头拍照返回的照片(缩略图)?
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent,REQUEST_SHOT);---------拍照成功返回的resultCode 是RESULT_OK
if(resultCode==RESULT_OK) { if(requestCode==REQUEST_SHOT) { Bundle bundle=data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data"); id_userphoto.setImageBitmap(bitmap); }可以从Intent中获取data 不过这个图片是缩略图哦!
4.如何使用系统摄像头拍照返回真实的照片呢?
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri photouri = Uri.fromFile(new File(mPicturePath));//记得添加sd卡读写权限 intent.putExtra(MediaStore.EXTRA_OUTPUT, photouri);//对系统拍照存储进行更改 startActivityForResult(intent,REQUEST_SHOT2);--------那就是改变系统拍照存储路径为你自定义的路径哦
if (requestCode == REQUEST_SHOT2) { FileInputStream fileInputStream=null; try { fileInputStream= new FileInputStream(mPicturePath); Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream); id_userphoto.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }然后再去从那个路径读取真实的皂片~你懂得!
问题:1.强制启动系统相机却未找到系统相机对应的包名。。。
2.如果开发商删除系统相机自己搞一套 那么就无法做适配,而且相机可能不能满足客户需求,所以定制一套自己的相机最为靠谱!有空再写~
群里的网友给了一个方法 可以获取所有系统预装的app的信息
private List<PackageInfo> getAllApps (Context activity) { List<PackageInfo> apps = new ArrayList<PackageInfo>(); PackageManager pManager = activity.getPackageManager(); //获取手机内所有应用 List<PackageInfo> paklist = pManager.getInstalledPackages(0); for (int i = 0; i < paklist.size(); i++) { PackageInfo pak = (PackageInfo) paklist.get(i); //判断系统预装的应用程序 if (!((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0)) { apps.add(pak); } } return apps; }用下面代码来找包名 很不幸的是 仍然没有找到~
PackageManager pManager = this.getPackageManager(); List<PackageInfo> appList = getAllSysApps(this); String packagename; for (int i = 0; i < appList.size(); i++) { PackageInfo pinfo = appList.get(i); //set Application Name if (("相机").equals(pManager.getApplicationLabel(pinfo.applicationInfo).toString())) { packagename = pinfo.packageName; Log.i("PictureChooseActivity", "packagename:" + packagename); } final Intent intent = new Intent(); final Intent intent_camera = getPackageManager() .getLaunchIntentForPackage("com.android.camera"); if (intent_camera != null) { intent.setPackage("com.android.camera"); } intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_SHOT); return true; }狗台电 你牛逼~
逼老子自己写一个!
代码参考慕课网
上一个activity 给他传了一个路径 确认result_ok 后 给MainActivity 返回路径 MainActicity加载存储在SD卡上的图片。package tr.nuctech.com.tr0100.Activity; import android.content.DialogInterface; import android.content.Intent; import android.graphics.ImageFormat; import android.hardware.Camera; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import com.example.com.qqslidingmenu.R; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; //需要声明相机使用权限 android.permission.CAMERA public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback { private Camera mCamera; private SurfaceView mPreview; private SurfaceHolder mHolder; private FloatingActionButton id_capture_btn; private String TAG = "CameraActivity"; private AlertDialog.Builder builder ; private String mPicturePath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); Intent intent = getIntent(); if(intent!=null) { mPicturePath= intent.getStringExtra("picturepath"); } Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mPreview = (SurfaceView) findViewById(R.id.id_preview); mPreview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCamera.autoFocus(null); } }); mHolder = mPreview.getHolder(); mHolder.addCallback(this); builder = new AlertDialog.Builder(this); builder.setMessage("确认使用该照片?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { setResult(RESULT_OK); finish(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { mCamera.stopPreview(); mCamera.startPreview(); } }); } @Override protected void onResume() { super.onResume(); if (mCamera == null) mCamera = getCamera(); if (mHolder != null && mCamera != null) setStartPreview(mCamera, mHolder); } @Override protected void onDestroy() { super.onDestroy(); releaseCamera(); } /* * 拍照功能 * */ public void capture(View view) { Camera.Parameters parameters = mCamera.getParameters(); parameters.setPictureFormat(ImageFormat.JPEG); parameters.setPreviewSize(800, 400); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//自动对焦 mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean b, Camera camera) { if (b) { mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] bytes, Camera camera) { File tempFIle = new File(mPicturePath); try { FileOutputStream fileOutputStream = new FileOutputStream(tempFIle); fileOutputStream.write(bytes); fileOutputStream.close(); builder.show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); } } }); } /* * 获取Camera对象 * */ private Camera getCamera() { Camera camera; try { camera = Camera.open(); } catch (Exception e) { camera = null; e.printStackTrace(); } return camera; } /* * 开始预览相机内容 * */ private void setStartPreview(Camera camera, SurfaceHolder surfaceHolder) { try { camera.setPreviewDisplay(surfaceHolder); camera.startPreview();//默认为横屏 下面为旋转90度为竖屏 // camera.setDisplayOrientation(90); } catch (IOException e) { e.printStackTrace(); } } /* * 释放相机资源 * */ private void releaseCamera() { if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { Log.i(TAG, "surfaceCreated"); setStartPreview(mCamera, mHolder); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { Log.i(TAG, "surfaceChanged"); mCamera.stopPreview(); setStartPreview(mCamera, mHolder); } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { Log.i(TAG, "surfaceDestroyed"); releaseCamera(); } }