ネットの情報を元にAndroidで5秒ごとにカメラ撮影を行うプログラムを作成しています。
カメラ撮影、画像の保存まではうまくいったのですが、
保存した画像の解像度が320×240になってしまいます。
実際は1280×720で保存したいと考えています。
どの点をどのように修正したらいいか教えてください。
該当のソースコード
ソースコード
MainActivity.java
public class MainActivity extends AppCompatActivity { private TextureView textureView; private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); 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 String cameraId; private CameraDevice cameraDevice; private CameraCaptureSession cameraCaptureSessions; private CaptureRequest.Builder captureRequestBuilder; private Size imageDimension; private ImageReader imageReader; private String filepath; private String dir; private File file; private static final int REQUEST_CAMERA_PERMISSION = 200; private static final int EXTERNAL_STORAGE_REQUEST_CODE = 1; private boolean mFlashSupported; private Handler mBackgroundHandler; private HandlerThread mBackgroundThread; private final int REPEAT_INTERVAL = 5000; private Handler handler = new Handler(); private Runnable runnable; CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { cameraDevice = camera; createCameraPreview();} @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { cameraDevice.close();} @Override public void onError(@NonNull CameraDevice cameraDevice, int i) { cameraDevice.close(); cameraDevice=null;} }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureView = (TextureView)findViewById(R.id.textureView); assert textureView != null; textureView.setSurfaceTextureListener(textureListener); runnable = new Runnable() { @Override public void run() { doSomething(); handler.postDelayed(this, REPEAT_INTERVAL); } }; handler.postDelayed(runnable, REPEAT_INTERVAL); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } private void takePicture() { if(cameraDevice == null) return; CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); try{ CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId()); Size[] jpegSizes = null; if(characteristics != null) jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) .getOutputSizes(ImageFormat.JPEG); //撮影画像の解像度変更 int width = 720; int height = 1280; if(jpegSizes != null && jpegSizes.length > 0) { width = jpegSizes[0].getWidth(); height = jpegSizes[0].getHeight(); } final ImageReader reader = ImageReader.newInstance(width,height,ImageFormat.JPEG,2); List<Surface> outputSurface = new ArrayList<>(11); outputSurface.add(reader.getSurface()); outputSurface.add(new Surface(textureView.getSurfaceTexture())); final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(reader.getSurface()); captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); int rotation = getWindowManager().getDefaultDisplay().getRotation(); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION,ORIENTATIONS.get(rotation)); File pathExternalPublicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); dir = pathExternalPublicDir.getPath(); String forname = "/FTPCAM"; File onedir = new File(dir + forname); if (onedir.exists()) { java.text.DateFormat dM = new java.text.SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); String MonthStr = dM.format(new Date()); file = new File(onedir+"/"+MonthStr.toString()+".jpeg");; filepath =file.toString(); } else {} ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader imageReader) { Image image = null; try{ image = reader.acquireLatestImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.capacity()]; buffer.get(bytes); save(bytes); } catch (FileNotFoundException e){ e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } finally { if(image != null){ image.close(); } } } private void save(byte[] bytes) throws IOException { OutputStream outputStream = null; try{ outputStream = new FileOutputStream(file); outputStream.write(bytes); registerDatabase(filepath); }finally { if(outputStream != null) outputStream.close(); } } }; reader.setOnImageAvailableListener(readerListener,mBackgroundHandler); final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); Toast.makeText(MainActivity.this, "Saved " + file, Toast.LENGTH_SHORT).show(); createCameraPreview(); } }; cameraDevice.createCaptureSession(outputSurface, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { try{ cameraCaptureSession.capture(captureBuilder.build(),captureListener,mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { } },mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private void registerDatabase(String file) { ContentValues contentValues = new ContentValues(); ContentResolver contentResolver = MainActivity.this.getContentResolver(); contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); contentValues.put("_data", file); contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); } private void createCameraPreview() { try{ SurfaceTexture texture = textureView.getSurfaceTexture(); assert texture != null; texture.setDefaultBufferSize(imageDimension.getWidth(),imageDimension.getHeight()); Surface surface = new Surface(texture); captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(surface); cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { if(cameraDevice == null) return; cameraCaptureSessions = cameraCaptureSession; updatePreview(); } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { Toast.makeText(MainActivity.this, "Changed", Toast.LENGTH_SHORT).show(); } },null); } catch (CameraAccessException e) { e.printStackTrace(); } } private void updatePreview() { if(cameraDevice == null) Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show(); captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); try{ cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(),null,mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private void openCamera() { CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); try{cameraId = manager.getCameraIdList()[0]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); assert map != null; imageDimension = map.getOutputSizes(SurfaceTexture.class)[0]; if(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this,new String[]{ Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE },REQUEST_CAMERA_PERMISSION); return;} manager.openCamera(cameraId,stateCallback,null); } catch (CameraAccessException e) { e.printStackTrace();} } TextureView.SurfaceTextureListener textureListener = new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) { openCamera();} @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {} @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { return false;} @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {} }; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if(requestCode == REQUEST_CAMERA_PERMISSION){ if(grantResults[0] != PackageManager.PERMISSION_GRANTED){ Toast.makeText(this, "You can't use camera without permission", Toast.LENGTH_SHORT).show(); finish(); } } } private void doSomething() { takePicture(); } @Override protected void onResume() { super.onResume(); startBackgroundThread(); if(textureView.isAvailable()) openCamera(); else textureView.setSurfaceTextureListener(textureListener); } @Override protected void onPause() { stopBackgroundThread(); super.onPause(); } private void stopBackgroundThread() { mBackgroundThread.quitSafely(); try{ mBackgroundThread.join(); mBackgroundThread= null; mBackgroundHandler = null; } catch (InterruptedException e) { e.printStackTrace(); } } private void startBackgroundThread() { mBackgroundThread = new HandlerThread("Camera Background"); mBackgroundThread.start(); mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); } }
補足情報
HAUWEI P10 lite Android7.0
Androidstudio 3.0.1
文字数の関係でソースコードをすべて左寄せにせざる得ませんでした。見にくくて申し訳ありません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/25 08:05