Android4.1 無預覽拍照

來源:互聯網
上載者:User

1、setParameters failed解決方案 2、無預覽拍照 客戶的需求千奇百怪,有要靜默安裝功能的,下載編譯好的ROM,在ROM中加入自己的應用程式實現靜默安裝,為了盈利好無恥啊。現在要實現無預覽拍照功能,哥們又哭笑不得,客戶是上帝,木有辦法。據說無預覽拍照在4.1中無法實現了。因為牽涉到使用者隱私問題。  看代碼吧,其實實現特簡單。主要是思路問題。 [java]  <SPAN style="FONT-SIZE: 14px">public class NoPreviewTakePicActivity extends Activity{      private Camera mCamera;      private CameraPreview mPreview;      private ToneGenerator mTone;      private static final int OPTION_SNAPSHOT = 0;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          mPreview = new CameraPreview(this);          setContentView(R.layout.main);          addContentView(mPreview, new LayoutParams(1, 1));// 在Layout中加入了一個寬高為1的一個預覽地區。但使用者確實看不到,就莫名其妙的拍照了。       }        @Override      public boolean onOptionsItemSelected(MenuItem item) {          int itemId = item.getItemId();          switch(itemId){          case OPTION_SNAPSHOT:              mCamera.takePicture(shutterCallback, null, jpegCallback);              break;          }          return true;      }      private PictureCallback jpegCallback = new PictureCallback(){            public void onPictureTaken(byte[] data, Camera camera) {              Parameters ps = camera.getParameters();              if(ps.getPictureFormat() == PixelFormat.JPEG){                  String path = save(data);                  Uri uri = Uri.fromFile(new File(path));                  Intent intent = new Intent();                  intent.setAction("android.intent.action.VIEW");                  intent.setDataAndType(uri, "image/jpeg");                  startActivity(intent);              }          }      };            private ShutterCallback shutterCallback = new ShutterCallback(){          public void onShutter() {              if(mTone == null){                  mTone = new ToneGenerator(AudioManager.STREAM_MUSIC,ToneGenerator.MAX_VOLUME);              }              mTone.startTone(ToneGenerator.TONE_PROP_BEEP2);          }      };            private String save(byte[] data){          String path = "/mnt/sdcard/"+System.currentTimeMillis()+".jpg";          try {              if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){                  String storage = Environment.getExternalStorageDirectory().toString();                  StatFs fs = new StatFs(storage);                  long available = fs.getAvailableBlocks()*fs.getBlockSize();                  if(available<data.length){                      return null;                  }                  File file = new File(path);                  if(!file.exists()){                      file.createNewFile();                  }                  FileOutputStream fos = new FileOutputStream(file);                  fos.write(data);                  fos.close();              }          } catch (Exception e) {              e.printStackTrace();              return null;          }          return path;      }        @Override      public boolean onCreateOptionsMenu(Menu menu) {          menu.add(0, OPTION_SNAPSHOT, 0, R.string.snapshot);          return super.onCreateOptionsMenu(menu);      }        class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {            SurfaceHolder mHolder;            public CameraPreview(Context context) {              super(context);              mHolder = getHolder();              mHolder.addCallback(this);              //mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 4.0+ auto           }          public void surfaceCreated(SurfaceHolder holder) {              mCamera = Camera.open(1);              try {                  mCamera.setPreviewDisplay(holder);              } catch (IOException exception) {                  mCamera.release();                  mCamera = null;              }          }            public void surfaceDestroyed(SurfaceHolder holder) {              mCamera.stopPreview();              mCamera.release();              mCamera = null;          }            public void surfaceChanged(SurfaceHolder holder, int format, int w,                  int h) {              Camera.Parameters parameters = mCamera.getParameters();              Size size = parameters.getPreviewSize();              Log.e(VIEW_LOG_TAG, "size.width="+size.width+"size.height="+size.height);              // setPreviewSize 寬高不能大於 parameters.getPreviewSize(),否者會出現java.lang.RuntimeException: setParameters failed錯誤               //parameters.setPreviewSize(800, 600);               mCamera.setParameters(parameters);              mCamera.startPreview();          }                }  }</SPAN>   public class NoPreviewTakePicActivity extends Activity{private Camera mCamera;private CameraPreview mPreview;private ToneGenerator mTone;private static final int OPTION_SNAPSHOT = 0; @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mPreview = new CameraPreview(this);setContentView(R.layout.main);addContentView(mPreview, new LayoutParams(1, 1));// 在Layout中加入了一個寬高為1的一個預覽地區。但使用者確實看不到,就莫名其妙的拍照了。} @Overridepublic boolean onOptionsItemSelected(MenuItem item) {int itemId = item.getItemId();switch(itemId){case OPTION_SNAPSHOT:mCamera.takePicture(shutterCallback, null, jpegCallback);break;}return true;}private PictureCallback jpegCallback = new PictureCallback(){ public void onPictureTaken(byte[] data, Camera camera) {Parameters ps = camera.getParameters();if(ps.getPictureFormat() == PixelFormat.JPEG){   String path = save(data);   Uri uri = Uri.fromFile(new File(path));       Intent intent = new Intent();       intent.setAction("android.intent.action.VIEW");       intent.setDataAndType(uri, "image/jpeg");       startActivity(intent);}}}; private ShutterCallback shutterCallback = new ShutterCallback(){public void onShutter() {if(mTone == null){mTone = new ToneGenerator(AudioManager.STREAM_MUSIC,ToneGenerator.MAX_VOLUME);}mTone.startTone(ToneGenerator.TONE_PROP_BEEP2);}}; private String save(byte[] data){String path = "/mnt/sdcard/"+System.currentTimeMillis()+".jpg";try {if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){String storage = Environment.getExternalStorageDirectory().toString();StatFs fs = new StatFs(storage);long available = fs.getAvailableBlocks()*fs.getBlockSize();if(available<data.length){return null;}File file = new File(path);if(!file.exists()){file.createNewFile();}FileOutputStream fos = new FileOutputStream(file);fos.write(data);fos.close();}} catch (Exception e) {e.printStackTrace();return null;}return path;} @Overridepublic boolean onCreateOptionsMenu(Menu menu) {menu.add(0, OPTION_SNAPSHOT, 0, R.string.snapshot);return super.onCreateOptionsMenu(menu);} class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; public CameraPreview(Context context) {super(context);mHolder = getHolder();mHolder.addCallback(this);//mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 4.0+ auto}public void surfaceCreated(SurfaceHolder holder) {mCamera = Camera.open(1);try {mCamera.setPreviewDisplay(holder);} catch (IOException exception) {mCamera.release();mCamera = null;}} public void surfaceDestroyed(SurfaceHolder holder) {mCamera.stopPreview();mCamera.release();mCamera = null;} public void surfaceChanged(SurfaceHolder holder, int format, int w,int h) {Camera.Parameters parameters = mCamera.getParameters();Size size = parameters.getPreviewSize();Log.e(VIEW_LOG_TAG, "size.width="+size.width+"size.height="+size.height);// setPreviewSize 寬高不能大於 parameters.getPreviewSize(),否者會出現java.lang.RuntimeException: setParameters failed錯誤//parameters.setPreviewSize(800, 600);mCamera.setParameters(parameters);mCamera.startPreview();} }} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.