最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android 7自定義相機(jī)預(yù)覽及拍照功能

 更新時(shí)間:2022年05月19日 09:10:06   作者:釋汐宇辰  
這篇文章主要為大家詳細(xì)介紹了android 7自定義相機(jī)預(yù)覽及拍照功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android實(shí)現(xiàn)攝像頭切換,拍照及保存到相冊(cè),預(yù)覽等功能,解決android7拍照之后不能連續(xù)預(yù)覽的問(wèn)題、參數(shù)設(shè)置相關(guān)問(wèn)題以及前后攝像頭語(yǔ)言顛倒等問(wèn)題。

import android.Manifest; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.support.v4.app.ActivityCompat; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.TextView; 
 
import com.hama.tracker.R; 
 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
 
 
public class CamaraActivity extends Activity implements View.OnClickListener { 
 
 @Bind(R.id.return_back) 
 TextView returnBack; 
 @Bind(R.id.tvswitch_camera) 
 TextView tvswitchCamera; 
 //啟動(dòng)攝像機(jī) 
 private Camera mCamera; 
 
 public boolean isopen_camara = false; 
 private SurfaceView surfaceView; 
 private SurfaceHolder mholder = null; 
 private SurfaceCallback previewCallBack; 
 private boolean isTakingPhoto;//是否正在拍照 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  verifyPermission(new String[]{Manifest.permission.CAMERA}); 
  // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
  setContentView(R.layout.activity_camara); 
  ButterKnife.bind(this); 
 
  // 預(yù)覽控件 
  surfaceView = (SurfaceView) this 
    .findViewById(R.id.surfaceView); 
  // 設(shè)置參數(shù) 
  surfaceView.getHolder().setKeepScreenOn(true); 
  surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
 
  returnBack.setOnClickListener(this); 
  tvswitchCamera.setOnClickListener(this); 
  EventBus.getDefault().register(this); 
 } 
 
 public void verifyPermission(String[] permissions) { 
  if (permissions != null) { 
   List<String> lists = new ArrayList<>(); 
   for (int i = 0; i < permissions.length; i++) { 
    if (ActivityCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) { 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) { 
 
     } 
     lists.add(permissions[i]); 
    } 
   } 
   if (lists.size() > 0) { 
    String[] ps = new String[lists.size()]; 
    for (int i = 0; i < lists.size(); i++) { 
     ps[i] = lists.get(i); 
    } 
    ActivityCompat.requestPermissions(this, ps, 1); 
   } 
  } 
 } 
 
 @Override 
 protected void onRestart() { 
  super.onRestart(); 
 } 
 
 @Override 
 protected void onStart() { 
  super.onStart(); 
 } 
 
 private void takePhoto() { 
  if (!isopen_camara) { 
   previewCallBack = new SurfaceCallback(); 
   surfaceView.getHolder().addCallback(previewCallBack); 
  } else { 
   autoTakePhoto(); 
  } 
 } 
 
 
 @Override 
 protected void onResume() { 
  super.onResume(); 
  if(mCamera == null){ 
   if (!isopen_camara) { 
    previewCallBack = new SurfaceCallback(); 
    surfaceView.getHolder().addCallback(previewCallBack); 
   } 
  } 
 
 } 
 
 @Override 
 public void onClick(View v) { 
  switch (v.getId()) { 
   case R.id.return_back: 
    finish(); 
    break; 
   case R.id.tvswitch_camera: 
    switchCamara(); 
    break; 
  } 
 } 
 
 
 // 預(yù)覽界面回調(diào) 
 private final class SurfaceCallback implements SurfaceHolder.Callback { 
  // 預(yù)覽界面被創(chuàng)建 
  public void surfaceCreated(SurfaceHolder holder) { 
   try { 
    //1代表打開后置攝像頭,0代表打開前置攝像頭. 
    mCamera = Camera.open(cameraPosition);// 打開攝像頭 
    setParams(holder,cameraPosition); 
   } catch (Exception e) { 
    e.printStackTrace(); 
    if (mCamera != null) { 
     mCamera.stopPreview(); 
     mCamera.lock(); 
     mCamera.release(); 
     mCamera = null; 
    } 
    finish(); 
    //Toast.makeText(getApplicationContext(), "該手機(jī)不支持自動(dòng)拍照功能", Toast.LENGTH_LONG).show(); 
   } 
  } 
 
  public void surfaceChanged(SurfaceHolder holder, int format, int width, 
         int height) { 
   System.out.println("surfaceChanged"); 
   isopen_camara = true; 
   //autoTakePhoto(); 
  } 
 
  // 預(yù)覽界面被銷毀 
  public void surfaceDestroyed(SurfaceHolder holder) { 
   System.out.println("surfaceDestroyed"); 
   if(!isopen_camara) 
    return; 
   if (mCamera != null) { 
    holder.removeCallback(this); 
    mCamera.setPreviewCallback(null); 
    mCamera.stopPreview(); 
    mCamera.lock(); 
    mCamera.release(); 
    mCamera = null; 
   } 
  } 
 
 } 
 
 public void reset(){ 
  Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
  if (mCamera != null) { 
   if(surfaceView != null && surfaceView.getHolder() != null && previewCallBack != null){ 
    surfaceView.getHolder().removeCallback(previewCallBack); 
   } 
   mCamera.setPreviewCallback(null); 
   mCamera.stopPreview(); 
   mCamera.lock(); 
   mCamera.release(); 
   mCamera = null; 
 
   mCamera = Camera.open(cameraPosition); 
   if (null != mholder) 
    setParams(mholder,cameraInfo.facing); 
  } 
 
 } 
 
 @Override 
 protected void onDestroy() { 
  super.onDestroy(); 
  if (mCamera != null) { 
   if(surfaceView != null && surfaceView.getHolder() != null && previewCallBack != null){ 
    surfaceView.getHolder().removeCallback(previewCallBack); 
   } 
   mCamera.setPreviewCallback(null); 
   mCamera.stopPreview(); 
   mCamera.lock(); 
   mCamera.release(); 
   mCamera = null; 
  } 
  ButterKnife.unbind(this); 
  EventBus.getDefault().unregister(this); 
 } 
 
 private void setParams(SurfaceHolder mySurfaceView,int postion) { 
  try { 
   int PreviewWidth = 0; 
   int PreviewHeight = 0; 
   WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);//獲取窗口的管理器 
   /*PreviewWidth = display.(); 
   PreviewHeight = display.getHeight();*/ 
 
   Camera.Parameters parameters = mCamera.getParameters(); 
   // 選擇合適的預(yù)覽尺寸 
   List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes(); 
 
   // 如果sizeList只有一個(gè)我們也沒(méi)有必要做什么了,因?yàn)榫退粋€(gè)別無(wú)選擇 
   if (sizeList.size() > 1) { 
    Iterator<Camera.Size> itor = sizeList.iterator(); 
    while (itor.hasNext()) { 
     Camera.Size cur = itor.next(); 
     /*if (cur.width >= PreviewWidth 
       && cur.height >= PreviewHeight) {*/ 
     if (cur.width >= PreviewWidth 
       && cur.height >= PreviewHeight) { 
      PreviewWidth = cur.width; 
      PreviewHeight = cur.height; 
      break; 
     } 
 
    } 
   } 
   parameters.setPreviewSize(PreviewWidth, PreviewHeight); //獲得攝像區(qū)域的大小 
   //parameters.setPreviewFrameRate(3);//每秒3幀 每秒從攝像頭里面獲得3個(gè)畫面 
   //parameters.setPreviewFpsRange(3,); 
   List<int[]> list = parameters.getSupportedPreviewFpsRange(); 
   int[] v = null; 
   int index = 0; 
   int min = 0; 
   for (int i = 0; i < list.size(); i++) { 
    v = list.get(i); 
    if (v[0] > min) { 
     min = v[0]; 
     index = i; 
    } 
   } 
   parameters.setPreviewFpsRange(list.get(index)[0], list.get(index)[1]); 
   parameters.setPictureFormat(PixelFormat.JPEG);//設(shè)置照片輸出的格式 
   parameters.set("jpeg-quality", 85);//設(shè)置照片質(zhì)量 
   parameters.setPictureSize(PreviewWidth, PreviewHeight);//設(shè)置拍出來(lái)的屏幕大小 
   parameters.setRotation(180); //Java部分 
   if (Build.VERSION.SDK_INT >= 24) { 
    if(postion == 0){ 
     mCamera.setDisplayOrientation(90); 
    }else { 
     mCamera.setDisplayOrientation(270); 
    } 
   } else { 
    mCamera.setDisplayOrientation(90); 
   } 
 
 
 
   mCamera.setParameters(parameters);//把上面的設(shè)置 賦給攝像頭 
   mCamera.setPreviewDisplay(mySurfaceView);//把攝像頭獲得畫面顯示在SurfaceView控件里面 
   mholder = mySurfaceView; 
   mCamera.setPreviewCallback(new Camera.PreviewCallback() { 
    @Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 
 
    } 
   }); 
   mCamera.startPreview();//開始預(yù)覽 
   // mPreviewRunning = true; 
  } catch (IOException e) { 
   Log.e("tag", e.toString()); 
  } 
 } 
 
 Handler handler = null; 
 
 private void autoTakePhoto() { 
  // 拍照前需要對(duì)焦 獲取清析的圖片 
  if (null == mCamera) return; 
  mCamera.autoFocus(new Camera.AutoFocusCallback() { 
   @Override 
   public void onAutoFocus(boolean success, Camera camera) { 
 
    if (success && isopen_camara) { 
     // 對(duì)焦成功 
     // Toast.makeText(MainActivity.this, "對(duì)焦成功 !!",Toast.LENGTH_SHORT).show(); 
     if(!isTakingPhoto) { 
      isTakingPhoto = true; 
      handler = new Handler(); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        mCamera.takePicture(null, null, new MyPictureCallback()); 
       } 
      }); 
     } 
    } 
   } 
  }); 
 } 
 
 // 照片回調(diào) 
 private final class MyPictureCallback implements Camera.PictureCallback { 
  // 照片生成后 
  @Override 
  public void onPictureTaken(byte[] data, Camera camera) { 
   try { 
    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
    Matrix matrix = new Matrix(); 
    matrix.setRotate(270); 
 
    File jpgFile = new File(Environment.getExternalStorageDirectory() + "/DCIM/camera"); 
    if (!jpgFile.exists()) { 
     jpgFile.mkdir(); 
    } 
    File jpgFile1 = new File(jpgFile.getAbsoluteFile(), System.currentTimeMillis() + ".jpg"); 
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
    FileOutputStream fos = new FileOutputStream(jpgFile1); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos); 
    ToastUtils.show(getApplicationContext(), getString(R.string.save_success)); 
    fos.close(); 
    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
    Uri uri = Uri.fromFile(jpgFile1); 
    intent.setData(uri); 
    sendBroadcast(intent); 
   } catch (Exception e) { 
    e.printStackTrace(); 
   }finally { 
    if(Build.VERSION.SDK_INT>=24){ 
     reset(); 
    } 
    isTakingPhoto = false; 
   } 
  } 
 } 
 
 private int cameraPosition = 1;//0代表前置攝像頭,1代表后置攝像頭 
 
 private void switchCamara() { 
  //切換前后攝像頭 
  int cameraCount = 0; 
  Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
  cameraCount = Camera.getNumberOfCameras();//得到攝像頭的個(gè)數(shù) 
 
  for (int i = 0; i < cameraCount; i++) { 
   Camera.getCameraInfo(i, cameraInfo);//得到每一個(gè)攝像頭的信息 
   if (cameraPosition == 1) { 
    //現(xiàn)在是后置,變更為前置 
    if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表攝像頭的方位,CAMERA_FACING_FRONT前置  CAMERA_FACING_BACK后置 
     if(surfaceView != null && surfaceView.getHolder() != null && previewCallBack != null){ 
      surfaceView.getHolder().removeCallback(previewCallBack); 
     } 
     mCamera.setPreviewCallback(null); 
     mCamera.stopPreview();//停掉原來(lái)攝像頭的預(yù)覽 
     mCamera.lock(); 
     mCamera.release();//釋放資源 
     mCamera = null;//取消原來(lái)攝像頭 
     mCamera = Camera.open(i);//打開當(dāng)前選中的攝像頭 
     /* try { 
      if (null != mholder) 
       mCamera.setPreviewDisplay(mholder);//通過(guò)surfaceview顯示取景畫面 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mCamera.startPreview();//開始預(yù)覽*/ 
     if (null != mholder) 
      setParams(mholder,Camera.CameraInfo.CAMERA_FACING_BACK); 
     cameraPosition = 0; 
     break; 
    } 
   } else { 
    //現(xiàn)在是前置, 變更為后置 
    if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表攝像頭的方位,CAMERA_FACING_FRONT前置  CAMERA_FACING_BACK后置 
     if(surfaceView != null && surfaceView.getHolder() != null && previewCallBack != null){ 
      surfaceView.getHolder().removeCallback(previewCallBack); 
     } 
     mCamera.setPreviewCallback(null); 
     mCamera.stopPreview();//停掉原來(lái)攝像頭的預(yù)覽 
     mCamera.lock(); 
     mCamera.release();//釋放資源 
     mCamera = null;//取消原來(lái)攝像頭 
     mCamera = Camera.open(i);//打開當(dāng)前選中的攝像頭 
     /*try { 
      if (null != mholder) 
       mCamera.setPreviewDisplay(mholder);//通過(guò)surfaceview顯示取景畫面 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mCamera.startPreview();//開始預(yù)覽*/ 
     if (null != mholder) 
      setParams(mholder,Camera.CameraInfo.CAMERA_FACING_FRONT); 
     cameraPosition = 1; 
     break; 
    } 
   } 
 
  } 
 } 
 
 @Override 
 public boolean onKeyDown(int keyCode, KeyEvent event) { 
  if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {///音量減拍照 
   takePhoto(); 
   return true; 
  } 
  return super.onKeyDown(keyCode, event); 
 
 } 
} 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android界面效果UI開發(fā)資料匯總(附資料包)

    Android界面效果UI開發(fā)資料匯總(附資料包)

    android ui界面設(shè)計(jì),友好的界面會(huì)提高用戶體驗(yàn)度;同時(shí)也增強(qiáng)了android ui界面設(shè)計(jì)的難度,本文提供了一些常用開發(fā)資料(有下載哦)感興趣的朋友可以了解下,希望會(huì)幫助到你
    2013-01-01
  • Android編程實(shí)現(xiàn)壓縮圖片并加載顯示的方法

    Android編程實(shí)現(xiàn)壓縮圖片并加載顯示的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)壓縮圖片并加載顯示的方法,涉及Android開發(fā)中圖片的運(yùn)算、壓縮處理操作及界面布局顯示壓縮圖片等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-10-10
  • Android png透明圖片轉(zhuǎn)jpg時(shí)背景變黑的解決方法

    Android png透明圖片轉(zhuǎn)jpg時(shí)背景變黑的解決方法

    這篇文章主要介紹了Android png透明圖片轉(zhuǎn)jpg時(shí)背景變黑的解決方法,需要的朋友可以參考下
    2017-12-12
  • Kotlin協(xié)程操作之創(chuàng)建啟動(dòng)掛起恢復(fù)詳解

    Kotlin協(xié)程操作之創(chuàng)建啟動(dòng)掛起恢復(fù)詳解

    本文的定位是協(xié)程的創(chuàng)建、啟動(dòng)、掛起、恢復(fù),也會(huì)示例一些簡(jiǎn)單的使用,這里不對(duì)suspend講解,,也不對(duì)協(xié)程的高級(jí)用法做闡述(熱數(shù)據(jù)通道Channel、冷數(shù)據(jù)流Flow...),本文主要講協(xié)程稍微深入的全面知識(shí)
    2022-08-08
  • Android自定義控件實(shí)現(xiàn)圓形進(jìn)度條

    Android自定義控件實(shí)現(xiàn)圓形進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)圓形進(jìn)度條的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android實(shí)現(xiàn)APP自動(dòng)更新功能

    Android實(shí)現(xiàn)APP自動(dòng)更新功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)APP自動(dòng)更新功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Flutter實(shí)現(xiàn)掃二維碼功能

    Flutter實(shí)現(xiàn)掃二維碼功能

    這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)掃二維碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • AndroidManifest.xml uses-feature功能詳解

    AndroidManifest.xml uses-feature功能詳解

    這篇文章主要介紹了AndroidManifest.xml uses-feature功能,較為詳細(xì)的分析了Android屬性過(guò)濾操作的功能與相關(guān)技巧,需要的朋友可以參考下
    2016-10-10
  • Android開發(fā)之繪制平面上的多邊形功能分析

    Android開發(fā)之繪制平面上的多邊形功能分析

    這篇文章主要介紹了Android開發(fā)之繪制平面上的多邊形功能,結(jié)合實(shí)例形式分析了Android多邊形圖形繪制的原理、步驟、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-09-09
  • Kotlin的枚舉與異常示例詳解

    Kotlin的枚舉與異常示例詳解

    這篇文章主要給大家介紹了關(guān)于Kotlin的枚舉與異常的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Kotlin具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評(píng)論

通渭县| 昭通市| 伊吾县| 高清| 朝阳区| 邓州市| 曲周县| 磴口县| 化德县| 长白| 康定县| 贺州市| 玛多县| 阿克陶县| 尼勒克县| 龙川县| 荆门市| 钦州市| 忻城县| 常熟市| 兴海县| 南安市| 玛纳斯县| 高阳县| 镇平县| 津南区| 安阳县| 密山市| 丁青县| 华安县| 靖州| 常熟市| 渝中区| 威宁| 常德市| 泽州县| 乐至县| 凤冈县| 政和县| 即墨市| 射阳县|