国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android圖片識(shí)別應(yīng)用詳解

2019-10-22 18:30:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近由于參加一個(gè)小小的創(chuàng)意比賽,用安卓做了一個(gè)小小的圖片識(shí)別應(yīng)用,主要是通過(guò)拍照識(shí)別圖片中的菜品,還有對(duì)象位置查找的東西。之前沒(méi)有做過(guò)安卓,都是拼拼湊湊多篇博客完成的,我也把這個(gè)項(xiàng)目的一些過(guò)程分享一下。先把功能貼一下,其實(shí)就是點(diǎn)擊拍照,將照片保存在本地,然后識(shí)別出圖中的菜品,然后用紅色方框圈出來(lái),并顯示菜品種類(lèi)。采用最新的Camera2的API,的確是比Camera好用。

Android,圖片識(shí)別

Android,圖片識(shí)別

1、界面

我采用了一個(gè)SurfaceView用來(lái)顯示攝像頭的預(yù)覽畫(huà)面,重寫(xiě)了一個(gè)SurfaceView來(lái)進(jìn)行紅色方框還有菜品名字的繪制。圖片是一個(gè)ImageVIew,相當(dāng)于拍照按鈕的功能。

 <?xml version="1.0" encoding="utf-8"?><RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.hd.hd.MainActivity">  <SurfaceView    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/surfaceView"    android:layout_centerHorizontal="true"    android:layout_centerVertical="true"/>  <com.hd.hd.SVDraw    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/mySurfaceView"    android:layout_centerHorizontal="true"    android:layout_centerVertical="true"/>  <LinearLayout    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:orientation="horizontal"    android:layout_alignParentBottom="true"    >  <ImageView    android:id="@+id/btngal"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:gravity="center_horizontal"    android:layout_alignParentBottom="true"    android:src="@drawable/s_8"    android:layout_alignParentLeft="true"     />  <TextView    android:id="@+id/textview"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:textColor="@color/white"    android:textSize="20dp"    android:layout_toRightOf="@id/btngal"    android:layout_alignParentTop="true"    />  </LinearLayout></RelativeLayout>

SVDraw,,繼承SurfaceView,用于繪制紅色方框

package com.hd.hd;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceView;import java.util.List;/*定義一個(gè)畫(huà)矩形框的類(lèi)*/public class SVDraw extends SurfaceView implements SurfaceHolder.Callback{  protected SurfaceHolder sh;  private int mWidth;  private int mHeight;  public SVDraw(Context context, AttributeSet attrs) {    super(context, attrs);    // TODO Auto-generated constructor stub     sh = getHolder();    sh.addCallback(this);    sh.setFormat(PixelFormat.TRANSPARENT);    setZOrderOnTop(true);  }  public void surfaceChanged(SurfaceHolder arg0, int arg1, int w, int h) {    // TODO Auto-generated method stub   }  public void surfaceCreated(SurfaceHolder sh) {    // TODO Auto-generated method stub    mWidth = this.getWidth();    mHeight = this.getHeight();  }  public void surfaceDestroyed(SurfaceHolder arg0) {    // TODO Auto-generated method stub   }  void clearDraw()  {    Canvas canvas = sh.lockCanvas();    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);    sh.unlockCanvasAndPost(canvas);  }  public void drawLine(List<String> keys, List<String> values)  {    Canvas canvas = sh.lockCanvas();    canvas.drawColor(Color.TRANSPARENT);    Paint p = new Paint();    p.setAntiAlias(true);    p.setColor(Color.RED);    p.setStrokeWidth(6);    p.setStyle(Paint.Style.STROKE);//設(shè)置空心    p.setTextSize(160);    Paint p1 = new Paint();    p1.setColor(Color.WHITE);    p1.setTextSize(80);    for(int i = 0;i < keys.size();i++){      String v = values.get(i);      v = v.replace("[","");      v = v.replace("]","");      String[] value = v.split(",");      canvas.drawRect(mWidth - Integer.parseInt(value[3]), Integer.parseInt(value[0]), mHeight - Integer.parseInt(value[1]), Integer.parseInt(value[2]), p);// 正方形      canvas.drawText(keys.get(i), mWidth - Integer.parseInt(value[3]), Integer.parseInt(value[0])-5, p1);    }    sh.unlockCanvasAndPost(canvas);  }}

2、上傳圖片到服務(wù)器,我沒(méi)有采用JSon的格式,而是直接將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組,發(fā)送給服務(wù)器。使用一個(gè)異步任務(wù),完成后,直接在onPostExcute()方法里繪制。

package com.hd.hd;import android.os.AsyncTask;import android.util.Log;import android.widget.TextView;import org.json.JSONException;import org.json.JSONObject;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.UUID;/** * Created by asus on 2017/8/13. */public class MyTask extends AsyncTask<String, Integer, String> {  private static String TAG = "MainActivity";  private File file; //需要發(fā)送的圖片  private String result_content; //服務(wù)器返回的結(jié)果  private SVDraw surfaceView;   //需要繪制的surfaceview  private TextView tv;    //顯示文字  private static final int TIME_OUT = 10 * 1000; // 超時(shí)時(shí)間  private static final String CHARSET = "utf-8"; // 設(shè)置編碼  public MyTask(File f,SVDraw s,TextView tv){    this.file = f;    this.surfaceView = s;    this.tv = tv;  }  @Override  protected void onPreExecute() {  }  //doInBackground方法內(nèi)部執(zhí)行后臺(tái)任務(wù),不可在此方法內(nèi)修改UI  @Override  protected String doInBackground(String... params) {    //調(diào)用文件上傳方法    result_content = uploadFile(file,"http://13.76.211.62/");    return null;  }  //onProgressUpdate方法用于更新進(jìn)度信息  @Override  protected void onProgressUpdate(Integer... progresses) {  }  //onPostExecute方法用于在執(zhí)行完后臺(tái)任務(wù)后更新UI,顯示結(jié)果  @Override  protected void onPostExecute(String result) {    //由于返回的是一個(gè)python的字典形式的字符串,用json來(lái)解析    JSONObject obj = null;    List<String> keys = new ArrayList<String>();    List<String> values = new ArrayList<String>();    try {      obj = new JSONObject(result_content);      //json對(duì)象的Key的迭代器,用來(lái)遍歷json      Iterator it = obj.keys();      while (it.hasNext()) {        String key = (String) it.next();        String value = obj.getString(key);        keys.add(key);        values.add(value);      }    } catch (JSONException e) {      e.printStackTrace();    }    //繪制圖形    surfaceView.clearDraw();    surfaceView.drawLine(keys,values);    tv.setText("搭配很贊哦");  }  //onCancelled方法用于在取消執(zhí)行中的任務(wù)時(shí)更改UI  @Override  protected void onCancelled() {  }  /**   * 上傳圖片文件到服務(wù)器   * @param file   * @param RequestURL   * @return   */  public static String uploadFile(File file, String RequestURL) {    String result = null;    String BOUNDARY = UUID.randomUUID().toString(); // 邊界標(biāo)識(shí) 隨機(jī)生成    String PREFIX = "--", LINE_END = "/r/n";    String CONTENT_TYPE = "multipart/form-data"; // 內(nèi)容類(lèi)型    try {      //創(chuàng)建URL連接,指明連接地址      URL url = new URL(RequestURL);      HttpURLConnection conn = (HttpURLConnection) url.openConnection();      //設(shè)置http請(qǐng)求的屬性為POST      conn.setReadTimeout(TIME_OUT);      conn.setConnectTimeout(TIME_OUT);      conn.setDoInput(true); // 允許輸入流      conn.setDoOutput(true); // 允許輸出流      conn.setUseCaches(false); // 不允許使用緩存      conn.setRequestMethod("POST"); // 請(qǐng)求方式      conn.setRequestProperty("Charset", CHARSET); // 設(shè)置編碼      conn.setRequestProperty("connection", "keep-alive");      conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);      if (file != null) {        /**         * 當(dāng)文件不為空,把文件包裝并且上傳         */        Log.i(TAG,"upload");        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());        Log.e(TAG,"not null");        /**         * 這里重點(diǎn)注意: name里面的值為服務(wù)端需要key 只有這個(gè)key 才可以得到對(duì)應(yīng)的文件         * filename是文件的名字,包含后綴名的 比如:abc.png         */        InputStream is = new FileInputStream(file);        byte[] bytes = new byte[1024];        int len;        while ((len = is.read(bytes)) != -1) {          dos.write(bytes, 0, len);        }        is.close();        dos.flush();        Log.e(TAG,"sent");        /**         * 獲取響應(yīng)碼 200=成功 當(dāng)響應(yīng)成功,獲取響應(yīng)的流         */        int res = conn.getResponseCode();        Log.e(TAG, "response code:" + res);        Log.e(TAG, "request success");        InputStream input = conn.getInputStream();        StringBuffer sb1 = new StringBuffer();        int ss;        while ((ss = input.read()) != -1) {          sb1.append((char) ss);        }        result = sb1.toString();        Log.e(TAG, "result : " + result);      }    } catch (MalformedURLException e) {      e.printStackTrace();    } catch (IOException e) {      e.printStackTrace();    }    return result;  }}

3、初始化界面、照相機(jī),使得照相機(jī)能夠?qū)崟r(shí)預(yù)覽,并實(shí)現(xiàn)拍照功能

 package com.hd.hd;import android.Manifest;import android.content.Context;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.ImageFormat;import android.hardware.camera2.CameraAccessException;import android.hardware.camera2.CameraCaptureSession;import android.hardware.camera2.CameraCharacteristics;import android.hardware.camera2.CameraDevice;import android.hardware.camera2.CameraManager;import android.hardware.camera2.CaptureRequest;import android.hardware.camera2.CaptureResult;import android.hardware.camera2.TotalCaptureResult;import android.media.Image;import android.media.ImageReader;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.HandlerThread;import android.support.annotation.NonNull;import android.support.annotation.RequiresApi;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.util.SparseIntArray;import android.view.Surface;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.util.Arrays;public class MainActivity extends AppCompatActivity{  private static final SparseIntArray ORIENTATIONS = new SparseIntArray();  private String TAG = "MainActivity";  ///為了使照片豎直顯示  static {    ORIENTATIONS.append(Surface.ROTATION_0, 90);    ORIENTATIONS.append(Surface.ROTATION_90, 0);    ORIENTATIONS.append(Surface.ROTATION_180, 270);    ORIENTATIONS.append(Surface.ROTATION_270, 180);  }  private SurfaceView mSurfaceView;  private SurfaceHolder mSurfaceHolder;  private CameraManager mCameraManager;//攝像頭管理器  private Handler childHandler, mainHandler;  private String mCameraID;//攝像頭Id 0 為后 1 為前  private ImageReader mImageReader;  private CameraCaptureSession mCameraCaptureSession;  private CameraDevice mCameraDevice;  private SVDraw hSurfaceView;  private MyTask myTask;  private CaptureRequest.Builder captureRequestBuilder;  private TextView tv;  private final int DRAW_ORDER = 10;  private Handler myHandler;  private ImageView imageView;  private String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Healthy_d/";  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    //此步驟非常重要,安卓不用自動(dòng)幫你創(chuàng)建文件夾來(lái)保存拍照的照片    File dirFirstFolder = new File(dir);//方法二:通過(guò)變量文件來(lái)獲取需要?jiǎng)?chuàng)建的文件夾名字    if(!dirFirstFolder.exists())    { //如果該文件夾不存在,則進(jìn)行創(chuàng)建      dirFirstFolder.mkdirs();//創(chuàng)建文件夾    }    //Android 6后有些敏感的權(quán)限不能隨意分配,必須向用戶發(fā)送請(qǐng)求賦予    //這里請(qǐng)求用戶賦予拍照,讀寫(xiě)內(nèi)存卡,連接網(wǎng)絡(luò)的權(quán)限,其實(shí)只有拍照權(quán)限需要向用戶請(qǐng)求,但是有備無(wú)患吧    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {      Log.e(TAG,ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)+"");      ActivityCompat.requestPermissions(MainActivity.this,          new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},          43);    }    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {      ActivityCompat.requestPermissions(MainActivity.this,          new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},          44);    }    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {      ActivityCompat.requestPermissions(MainActivity.this,          new String[]{Manifest.permission.INTERNET},          45);    }    initVIew();  }  /**   * 初始化視圖   */  private void initVIew() {    HandlerThread handlerThread = new HandlerThread("Camera2");    handlerThread.start();    childHandler = new Handler(handlerThread.getLooper());    //mSurfaceView    mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);    hSurfaceView = (SVDraw) findViewById(R.id.mySurfaceView);    imageView = (ImageView) findViewById(R.id.btngal);    tv = (TextView)findViewById(R.id.textview);    //設(shè)置ImageView監(jiān)聽(tīng)器,點(diǎn)擊圖片,拍照    imageView.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        Toast.makeText(MainActivity.this, "正在識(shí)別,請(qǐng)稍等", Toast.LENGTH_LONG).show();        if (mCameraDevice == null) return;        // 創(chuàng)建拍照需要的CaptureRequest.Builder        try {          captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);          // 將imageReader的surface作為CaptureRequest.Builder的目標(biāo)          captureRequestBuilder.addTarget(mImageReader.getSurface());          // 自動(dòng)對(duì)焦          captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);          // 自動(dòng)曝光          captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);          // 獲取手機(jī)方向          int rotation = getWindowManager().getDefaultDisplay().getRotation();          // 根據(jù)設(shè)備方向計(jì)算設(shè)置照片的方向          captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));          //拍照          CaptureRequest mCaptureRequest = captureRequestBuilder.build();          mCameraCaptureSession.capture(mCaptureRequest, mSessionCaptureCallback, childHandler);        } catch (CameraAccessException e) {          e.printStackTrace();        }      }    });    mSurfaceHolder = mSurfaceView.getHolder();    mSurfaceHolder.setKeepScreenOn(true);    // mSurfaceView添加回調(diào)    mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {      @Override      public void surfaceCreated(SurfaceHolder holder) { //SurfaceView創(chuàng)建        // 初始化Camera        initCamera2();      }      @Override      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {      }      @Override      public void surfaceDestroyed(SurfaceHolder holder) { //SurfaceView銷(xiāo)毀        // 釋放Camera資源        if (null != mCameraDevice) {          mCameraDevice.close();          mCameraDevice = null;        }      }    });  }  //拍照時(shí),可以對(duì)照片進(jìn)行操作,這里可以不寫(xiě),因?yàn)槲覜](méi)對(duì)其進(jìn)行操作  private CameraCaptureSession.CaptureCallback mSessionCaptureCallback =      new CameraCaptureSession.CaptureCallback() {        @Override        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,                        TotalCaptureResult result) {}        @Override        public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,                        CaptureResult partialResult){}};  /**   * 初始化Camera2   */  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)  private void initCamera2() {    HandlerThread handlerThread = new HandlerThread("Camera2");    handlerThread.start();    childHandler = new Handler(handlerThread.getLooper());    mainHandler = new Handler(getMainLooper());    mCameraID = "" + CameraCharacteristics.LENS_FACING_FRONT;//后攝像頭    mImageReader = ImageReader.newInstance(mSurfaceView.getWidth(), mSurfaceView.getHeight(), ImageFormat.JPEG,1);    mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { //可以在這里處理拍照得到的臨時(shí)照片 例如,寫(xiě)入本地      @Override      public void onImageAvailable(ImageReader reader) {        Image image = reader.acquireNextImage();        ByteBuffer buffer = image.getPlanes()[0].getBuffer();        byte[] bytes = new byte[buffer.remaining()];        buffer.get(bytes);//由緩沖區(qū)存入字節(jié)數(shù)組        Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);        String fileName = "test";        File file = new File(dir + fileName + ".jpg");        String state = Environment.getExternalStorageState();        //如果狀態(tài)不是mounted,無(wú)法讀寫(xiě)        if (!state.equals(Environment.MEDIA_MOUNTED)) {          return;        }        FileOutputStream out = null;        try {          out = new FileOutputStream(file);          bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);//轉(zhuǎn)化為jpeg圖片          out.flush();          out.close();          image.close();//一定要記得關(guān),否則會(huì)出現(xiàn)程序崩潰        } catch (FileNotFoundException e) {          e.printStackTrace();        } catch (IOException e) {          e.printStackTrace();        }        new MyTask(file,hSurfaceView,tv).execute();      }    }, mainHandler);    //獲取攝像頭管理    mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);    try {      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {        ActivityCompat.requestPermissions(this,            new String[]{Manifest.permission.CAMERA},            42);      }      //打開(kāi)攝像頭      mCameraManager.openCamera(mCameraID, stateCallback, mainHandler);    } catch (CameraAccessException e) {      e.printStackTrace();    }  }  /**   * 當(dāng)發(fā)送權(quán)限請(qǐng)求用戶響應(yīng)時(shí),回調(diào)該函數(shù)   * @param requestCode   * @param permissions   * @param grantResults   */  @Override  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    if (requestCode == 42) {      Toast.makeText(this, "CAMERA PERMISSION GRANTED", Toast.LENGTH_SHORT).show();      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {        //申請(qǐng)成功,可以拍照        Log.i(TAG,"apply camera success");        CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);        try {          if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {            Toast.makeText(this, "CAMERA PERMISSION DENIED", Toast.LENGTH_SHORT).show();          }          mCameraManager.openCamera(mCameraID, stateCallback, mainHandler);        } catch (CameraAccessException e) {          e.printStackTrace();        }      } else {        Toast.makeText(this, "CAMERA PERMISSION DENIED", Toast.LENGTH_SHORT).show();      }      return;    }    super.onRequestPermissionsResult(requestCode, permissions, grantResults);  }  /**   * 攝像頭創(chuàng)建監(jiān)聽(tīng)   */  private CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {    @Override    public void onOpened(CameraDevice camera) {//打開(kāi)攝像頭      mCameraDevice = camera;      //開(kāi)啟預(yù)覽      takePreview();    }    @Override    public void onDisconnected(CameraDevice camera) {//關(guān)閉攝像頭      if (null != mCameraDevice) {        mCameraDevice.close();        mCameraDevice = null;      }    }    @Override    public void onError(CameraDevice camera, int error) {//發(fā)生錯(cuò)誤      Toast.makeText(MainActivity.this, "攝像頭開(kāi)啟失敗", Toast.LENGTH_SHORT).show();    }  };  /**   * 開(kāi)始預(yù)覽   */  private void takePreview() {    try {      // 創(chuàng)建預(yù)覽需要的CaptureRequest.Builder      final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);      // 將SurfaceView的surface作為CaptureRequest.Builder的目標(biāo)      previewRequestBuilder.addTarget(mSurfaceHolder.getSurface());//      previewRequestBuilder.addTarget(mImageReader.getSurface());      // 創(chuàng)建CameraCaptureSession,該對(duì)象負(fù)責(zé)管理處理預(yù)覽請(qǐng)求和拍照請(qǐng)求      mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceHolder.getSurface(), mImageReader.getSurface()), new CameraCaptureSession.StateCallback() // ③      {        @Override        public void onConfigured(CameraCaptureSession cameraCaptureSession) {          if (null == mCameraDevice) return;          // 當(dāng)攝像頭已經(jīng)準(zhǔn)備好時(shí),開(kāi)始顯示預(yù)覽          mCameraCaptureSession = cameraCaptureSession;          try {            // 自動(dòng)對(duì)焦            previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);            // 打開(kāi)閃光燈            previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);            // 顯示預(yù)覽            CaptureRequest previewRequest = previewRequestBuilder.build();            mCameraCaptureSession.setRepeatingRequest(previewRequest, null, childHandler);          } catch (CameraAccessException e) {            e.printStackTrace();          }        }        @Override        public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {          Toast.makeText(MainActivity.this, "配置失敗", Toast.LENGTH_SHORT).show();        }      }, childHandler);    } catch (CameraAccessException e) {      e.printStackTrace();    }  }}

4、AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="com.hd.hd">  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  <uses-permission android:name="android.permission.CAMERA"/>  <uses-feature android:name="android.hardware.camera2.full" />  <uses-permission android:name="android.permission.INTERNET" />  <application    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:supportsRtl="true"    android:theme="@style/AppTheme">    <activity android:name=".MainActivity">      <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />      </intent-filter>    </activity>  </application></manifest>

今天代碼先分享到那么多,明天給大家分享一下Camera2的架構(gòu)。有不懂的可以評(píng)論,一起討論。

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东城区| 西乌珠穆沁旗| 井陉县| 柳林县| 榆社县| 和平区| 应用必备| 苗栗市| 淮阳县| 延长县| 宁化县| 教育| 吉安市| 临汾市| 景泰县| 沽源县| 阿坝| 茶陵县| 夹江县| 彰武县| 公主岭市| 绥化市| 中方县| 时尚| 黔南| 库尔勒市| 封开县| 柳州市| 霍林郭勒市| 固始县| 纳雍县| 白朗县| 阿坝县| 长乐市| 阜康市| 城市| 电白县| 抚远县| 崇仁县| 伽师县| 溧水县|