-
-
Save woshidan/60aecf5ab34d0c364f4fc8a1aadf5924 to your computer and use it in GitHub Desktop.
Camera2_API_Sample
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
android:orientation="horizontal" | |
android:layout_width="fill_parent" | |
android:layout_height="fill_parent" | |
> | |
<TextureView | |
android:id="@+id/texture" | |
android:layout_width="fill_parent" | |
android:layout_height="fill_parent" | |
android:layout_weight="1" | |
> | |
</TextureView> | |
<Button | |
android:id="@+id/button_capture" | |
android:text="Capture" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_gravity="center" | |
/> | |
</LinearLayout> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.woshidan.cameratest; | |
import android.annotation.TargetApi; | |
import android.app.Activity; | |
import android.content.Context; | |
import android.graphics.Bitmap; | |
import android.graphics.SurfaceTexture; | |
import android.hardware.camera2.CameraAccessException; | |
import android.hardware.camera2.CameraCaptureSession; | |
import android.hardware.camera2.CameraDevice; | |
import android.hardware.camera2.CameraManager; | |
import android.hardware.camera2.CaptureRequest; | |
import android.os.Build; | |
import android.os.Bundle; | |
import android.os.Handler; | |
import android.view.Surface; | |
import android.view.TextureView; | |
import android.view.View; | |
import android.widget.Button; | |
import java.io.File; | |
import java.io.FileNotFoundException; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
import java.util.Arrays; | |
@TargetApi(Build.VERSION_CODES.LOLLIPOP) | |
public class MainActivity extends Activity { | |
private CameraDevice mCameraDevice; | |
private TextureView mTextureView; | |
private Handler mBackgroundHandler = new Handler(); | |
private CameraCaptureSession mCaptureSession = null; | |
private CaptureRequest.Builder mPreviewRequestBuilder; | |
private CaptureRequest mPreviewRequest; | |
@TargetApi(Build.VERSION_CODES.M) | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
mTextureView = (TextureView) findViewById(R.id.texture); | |
mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { | |
@Override | |
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { | |
// 先ほどのカメラを開く部分をメソッド化した | |
openCamera(); | |
} | |
@Override | |
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { | |
} | |
@Override | |
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { | |
return true; | |
} | |
@Override | |
public void onSurfaceTextureUpdated(SurfaceTexture surface) { | |
} | |
}); | |
Button capture = (Button) findViewById(R.id.button_capture); | |
capture.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View v) { | |
try { | |
mCaptureSession.stopRepeating(); // プレビューの更新を止める | |
if(mTextureView.isAvailable()) { | |
File file = new File(getFilesDir(), "surface_text.jpg"); | |
FileOutputStream fos = new FileOutputStream(file); | |
Bitmap bitmap = mTextureView.getBitmap(); | |
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, fos); | |
fos.close(); | |
} | |
} catch (CameraAccessException e) { | |
e.printStackTrace(); | |
} catch (FileNotFoundException e) { | |
e.printStackTrace(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
}); | |
} | |
private void openCamera() { | |
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); | |
String selectedCameraId = ""; | |
try { | |
selectedCameraId = manager.getCameraIdList()[0]; | |
// https://github.com/googlesamples/android-Camera2Basic/blob/5dad16c103715b5e7e3c001cc5f6067f8d23f29e/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L499 | |
// あたりにあるのですが、顔用カメラを使いたくないなどがあれば、CameraCharacteristicsを経由して確認可能 | |
// CameraCharacteristics characteristics | |
// = manager.getCameraCharacteristics(selectedCameraId); | |
} catch (CameraAccessException e) { | |
e.printStackTrace(); | |
} | |
try { | |
manager.openCamera(selectedCameraId, mStateCallback, mBackgroundHandler); | |
} catch (CameraAccessException e) { | |
e.printStackTrace(); | |
} | |
} | |
private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() { | |
@Override | |
public void onOpened(CameraDevice cameraDevice) { | |
mCameraDevice = cameraDevice; | |
createCameraPreviewSession(); | |
} | |
@Override | |
public void onDisconnected(CameraDevice cameraDevice) { | |
cameraDevice.close(); | |
mCameraDevice = null; | |
} | |
@Override | |
public void onError(CameraDevice cameraDevice, int error) { | |
cameraDevice.close(); | |
mCameraDevice = null; | |
} | |
}; | |
private void createCameraPreviewSession() { | |
SurfaceTexture texture = mTextureView.getSurfaceTexture(); | |
texture.setDefaultBufferSize(320, 240); // 自分の手元のデバイスで決めうちしてます | |
Surface surface = new Surface(texture); | |
try { | |
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); | |
mPreviewRequestBuilder.addTarget(surface); | |
mPreviewRequest = mPreviewRequestBuilder.build(); | |
} catch (CameraAccessException e) { | |
e.printStackTrace(); | |
} | |
try { | |
mCameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { | |
@Override | |
public void onConfigured(CameraCaptureSession session) { | |
// カメラがcloseされている場合 | |
if (null == mCameraDevice) { | |
return; | |
} | |
mCaptureSession = session; | |
try { | |
session.setRepeatingRequest(mPreviewRequest, null, null); | |
} catch (CameraAccessException e) { | |
e.printStackTrace(); | |
} | |
} | |
@Override | |
public void onConfigureFailed(CameraCaptureSession session) { | |
} | |
}, null); | |
} catch (CameraAccessException e) { | |
e.printStackTrace(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
package="com.example.woshidan.cameratest"> | |
<uses-permission android:name="android.permission.CAMERA" /> | |
<uses-feature android:name="android.hardware.camera" /><!-- カメラが使えない端末でプレイストアで検索したときこのアプリを表示させない --> | |
<application | |
android:allowBackup="true" | |
android:icon="@mipmap/ic_launcher" | |
android:label="@string/app_name" | |
android:roundIcon="@mipmap/ic_launcher_round" | |
android:supportsRtl="true" | |
android:theme="@android:style/Theme.Holo"> | |
<activity | |
android:name=".MainActivity" | |
android:label="@string/app_name" | |
android:screenOrientation="landscape" | |
android:theme="@android:style/Theme.Holo.NoActionBar"> | |
<intent-filter> | |
<action android:name="android.intent.action.MAIN" /> | |
<category android:name="android.intent.category.LAUNCHER" /> | |
</intent-filter> | |
</activity> | |
</application> | |
</manifest> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment