728x90
반응형
거두절미하고 시작합니다.
카메라 퍼미션 허용
>manifests
<!-- 카메라 권한 요청 -->
<uses-permission android:name="android.permission.CAMERA" /> <!-- 앱 파일 권한 요청 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
라이브러리 설치
>build.gradle
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
이미지를 보이게 하는 라이브러리
각 설명은 주석으로 달아 놓았으니 참고하면서 최대한 정보 뽑아가세요
액티비티화면은 총 2개 이며 java 파일은 총 4개 입니다.
프리뷰
package com.example.nailmanna;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
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.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.TotalCaptureResult;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.Image;
import android.media.ImageReader;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import android.util.Size;
import android.util.SparseIntArray;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by BRB_LAB on 2016-06-07.
* Modified by JS on 2019-04-03.
*/
class Preview extends Thread {
private final static String TAG = "Preview : ";
private Size mPreviewSize;
private Context mContext;
private CameraDevice mCameraDevice;
private CaptureRequest.Builder mPreviewBuilder;
private CameraCaptureSession mPreviewSession;
private TextureView mTextureView;
private String mCameraId = "0";
private Button mNormalAngleButton;
private Button mWideAngleButton;
private Button mCameraCaptureButton;
private Button mCameraDirectionButton;
private int mWidth;
private static final SparseIntArray ORIENTATIONS = new SparseIntArray(4);
//카메라 회전대응
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);
}
public Preview(Context context, TextureView textureView, Button button1, Button button2, Button button3, Button button4) {
mContext = context;
mTextureView = textureView;
mNormalAngleButton = button1;
mWideAngleButton = button2;
mCameraCaptureButton = button3;
mCameraDirectionButton = button4;
mNormalAngleButton.setOnClickListener(new View.OnClickListener() {
//전면카메라로 전환
@Override
public void onClick(View v) {
onPause();
mCameraId = "0";
openCamera();
}
});
mWideAngleButton.setOnClickListener(new View.OnClickListener() {
//후면카메라로 전환
@Override
public void onClick(View v) {
onPause();
mCameraId = "2";
openCamera();
}
});
mCameraCaptureButton.setOnClickListener(new View.OnClickListener() {
//사진 촬영버튼 이벤트 읽기
@Override
public void onClick(View v) {
takePicture();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if(commonData.getInstance().GetLeftHand()==1){
Intent intent = new Intent(
mContext.getApplicationContext(), // 현재 화면의 제어권자
SelecthandLeftActivity.class); // 다음 넘어갈 클래스 지정
mContext.startActivity(intent);
//내가 실행하고 싶은 코드
mCameraCaptureButton.setClickable(false);
PhotoCu(commonData.getInstance().GetLastAccess());
commonData.getInstance().SetHandSelect(1,0);
commonData.getInstance().SetHandSelect(2,0);
commonData.getInstance().SetHandSelect(3,0);
commonData.getInstance().SetHandSelect(4,0);
commonData.getInstance().SetHandSelect(5,0);
}else{
Intent intent = new Intent(
mContext.getApplicationContext(), // 현재 화면의 제어권자
SelecthandActivity.class); // 다음 넘어갈 클래스 지정
mContext.startActivity(intent);
//내가 실행하고 싶은 코드
mCameraCaptureButton.setClickable(false);
PhotoCu(commonData.getInstance().GetLastAccess());
commonData.getInstance().SetHandSelect(1,0);
commonData.getInstance().SetHandSelect(2,0);
commonData.getInstance().SetHandSelect(3,0);
commonData.getInstance().SetHandSelect(4,0);
commonData.getInstance().SetHandSelect(5,0);
}
}
}, 1000);
}
});
mCameraDirectionButton.setOnClickListener(new View.OnClickListener() {
//전환버튼 클릭시 후면 전면 번갈아 실행
@Override
public void onClick(View v) {
onPause();
if (mCameraId.equals("1")) {
mCameraId = "0";
} else {
mCameraId = "1";
}
openCamera();
}
});
}
// 이미지 불러오기 위한 카메라 id 갖고오기
private String getBackFacingCameraId(CameraManager cManager) {
try {
for (final String cameraId : cManager.getCameraIdList()) {
CameraCharacteristics characteristics = cManager.getCameraCharacteristics(cameraId);
int cOrientation = characteristics.get(CameraCharacteristics.LENS_FACING);
if (cOrientation == CameraCharacteristics.LENS_FACING_BACK) return cameraId;
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
return null;
}
//카메라 열기
public void openCamera() {
// 카메라 작업의 시작
CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
Log.e(TAG, "openCamera E");
try {
String cameraId = getBackFacingCameraId(manager);
CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];
int permissionCamera = ContextCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA);
int permissionStorage = ContextCompat.checkSelfPermission(mContext,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionCamera == PackageManager.PERMISSION_DENIED) {
ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.CAMERA}, CamActivity.REQUEST_CAMERA);
}else{
manager.openCamera(mCameraId, mStateCallback, null);
}
} catch (CameraAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e(TAG, "openCamera X");
}
private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
// TODO Auto-generated method stub
Log.e(TAG, "onSurfaceTextureAvailable, width=" + width + ", height=" + height);
openCamera();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface,
int width, int height) {
// TODO Auto-generated method stub
Log.e(TAG, "onSurfaceTextureSizeChanged");
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
// TODO Auto-generated method stub
}
};
private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
// TODO Auto-generated method stub
Log.e(TAG, "onOpened");
mCameraDevice = camera;
startPreview();
}
@Override
public void onDisconnected(CameraDevice camera) {
// TODO Auto-generated method stub
Log.e(TAG, "onDisconnected");
}
@Override
public void onError(CameraDevice camera, int error) {
// TODO Auto-generated method stub
Log.e(TAG, "onError");
}
};
protected void startPreview() {
// TODO Auto-generated method stub
if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) {
Log.e(TAG, "startPreview fail, return");
}
SurfaceTexture texture = mTextureView.getSurfaceTexture();
if (null == texture) {
Log.e(TAG, "texture is null, return");
return;
}
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface surface = new Surface(texture);
try {
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
} catch (CameraAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mPreviewBuilder.addTarget(surface);
try {
mCameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
// TODO Auto-generated method stub
mPreviewSession = session;
updatePreview();
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
// TODO Auto-generated method stub
Toast.makeText(mContext, "onConfigureFailed", Toast.LENGTH_LONG).show();
}
}, null);
} catch (CameraAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void updatePreview() {
// TODO Auto-generated method stub
if (null == mCameraDevice) {
Log.e(TAG, "updatePreview error, return");
}
mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
HandlerThread thread = new HandlerThread("CameraPreview");
thread.start();
Handler backgroundHandler = new Handler(thread.getLooper());
try {
mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler);
} catch (CameraAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private Runnable mDelayPreviewRunnable = new Runnable() {
@Override
public void run() {
startPreview();
}
};
protected void takePicture() {
if (null == mCameraDevice) {
Log.e(TAG, "mCameraDevice is null, return");
return;
}
try {
Size[] jpegSizes = null;
CameraManager cameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(mCameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (map != null) {
jpegSizes = map.getOutputSizes(ImageFormat.JPEG);
// Log.d("TEST", "map != null " + jpegSizes.length);
}
int width = 640;
int height = 480;
if (jpegSizes != null && 0 < jpegSizes.length) {
// for (int i = 0 ; i < jpegSizes.length; i++) {
// Log.d("TEST", "getHeight = " + jpegSizes[i].getHeight() + ", getWidth = " + jpegSizes[i].getWidth());
// }
width = jpegSizes[0].getWidth();
height = jpegSizes[0].getHeight();
}
ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
List<Surface> outputSurfaces = new ArrayList<Surface>(2);
outputSurfaces.add(reader.getSurface());
outputSurfaces.add(new Surface(mTextureView.getSurfaceTexture()));
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(reader.getSurface());
// captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
// Orientation
int rotation = ((Activity) mContext).getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HHmm");
Log.i("time check", "===> "+dateFormat);
// String today = null;
//
// Date date = new Date();
//
// System.out.println(date);
//
// // 포맷변경 ( 년월일 시분초)
// SimpleDateFormat sdformat = new SimpleDateFormat("yyyy_MM_dd_HHmm");
//
// // Java 시간 더하기
//
// Calendar cal = Calendar.getInstance();
//
// cal.setTime(date);
//
// // 1시간 전
// cal.add(Calendar.HOUR, -1);
//
// today = sdformat.format(cal.getTime());
// System.out.println("1시간 전 : " + today);
//
// cal.setTime(date);
//
// // 하루 전
// cal.add(Calendar.HOUR, +9);
//
// today = sdformat.format(cal.getTime());
final File file = new File(Environment.getExternalStorageDirectory() + "/DCIM", ""+commonData.getInstance().GetLastLoginID()+"_" + dateFormat.format(date) + ".jpg");
// 마지막 이미지 싱글톤에 저장
String url = Environment.getExternalStorageDirectory() + "/DCIM/"+commonData.getInstance().GetLastLoginID()+"_" + dateFormat.format(date) + ".jpg";
commonData.getInstance().SetLastImageURL(url);
ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
try {
image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes);
save(bytes);
Log.d(TAG, "[junsu] save()");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (image != null) {
image.close();
reader.close();
}
}
}
private void save(byte[] bytes) throws IOException {
OutputStream output = null;
try {
output = new FileOutputStream(file);
output.write(bytes);
} finally {
if (null != output) {
output.close();
}
}
}
};
HandlerThread thread = new HandlerThread("CameraPicture");
thread.start();
final Handler backgroudHandler = new Handler(thread.getLooper());
reader.setOnImageAvailableListener(readerListener, backgroudHandler);
final Handler delayPreview = new Handler();
final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session,
CaptureRequest request, TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
Toast.makeText(mContext, "Saved:" + file, Toast.LENGTH_SHORT).show();
delayPreview.postDelayed(mDelayPreviewRunnable, 100);
// startPreview();
}
};
mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
try {
session.capture(captureBuilder.build(), captureListener, backgroudHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
}, backgroudHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
public void setSurfaceTextureListener() {
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
public void onResume() {
Log.d(TAG, "onResume");
setSurfaceTextureListener();
}
private Semaphore mCameraOpenCloseLock = new Semaphore(1);
public void onPause() {
// TODO Auto-generated method stub
Log.d(TAG, "onPause");
try {
mCameraOpenCloseLock.acquire();
if (null != mCameraDevice) {
mCameraDevice.close();
mCameraDevice = null;
Log.d(TAG, "CameraDevice Close");
}
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted while trying to lock camera closing.");
} finally {
mCameraOpenCloseLock.release();
}
}
public void PhotoCu(String token){// timeout setting 해주기
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(100, TimeUnit.SECONDS)
.readTimeout(100, TimeUnit.SECONDS)
.writeTimeout(100, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://43.200.13.213:8000/first/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()).build();
UserService userService = retrofit.create(UserService.class);
String m_token = "Bearer "+token;
File file = new File(commonData.getInstance().GetLastImageURL());
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("my_photo", file.getName(),requestFile);
Call<AddCustomerRes> PhotoCu = userService.PhotoCu(m_token, body);
PhotoCu.enqueue(new Callback<AddCustomerRes>() {
@Override
public void onResponse(Call<AddCustomerRes> call, Response<AddCustomerRes> response) {
if( response.isSuccessful() ){
Log.i("say", "Done");
}else {
Log.i("say","response nononono "+response.code());
}
}
@Override
public void onFailure(Call<AddCustomerRes> call, Throwable t) {
Log.i("say_PhotoPost","failure " + t.getMessage());
}
});
}
}
프리뷰 셋뚜 cam Activity
package com.example.nailmanna;
import android.Manifest;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.TextureView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import com.bumptech.glide.Glide;
public class CamActivity extends AppCompatActivity {
private TextureView mCameraTextureView;
private Preview mPreview;
private Button mNormalAngleButton;
private Button mWideAngleButton;
private Button mCameraCaptureButton;
private Button mCameraDirectionButton;
Dialog dialog01;
ImageView gaid,left;
Activity mainActivity = this;
private static final String TAG = "MAINACTIVITY";
static final int REQUEST_CAMERA = 1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_cam);
//버튼 갖고오기
mNormalAngleButton = (Button) findViewById(R.id.normal);
mWideAngleButton = (Button) findViewById(R.id.wide);
mCameraCaptureButton = (Button) findViewById(R.id.capture);
mCameraDirectionButton = (Button) findViewById(R.id.change);
mCameraTextureView = (TextureView) findViewById(R.id.cameraTextureView);
mPreview = new Preview(this, mCameraTextureView, mNormalAngleButton, mWideAngleButton, mCameraCaptureButton, mCameraDirectionButton);
//가이드 수정
gaid = findViewById(R.id.gaid);
left = findViewById(R.id.left);
if(commonData.getInstance().GetLeftHand()==1){
gaid.setVisibility(View.GONE);
left.setVisibility(View.VISIBLE);
}
mCameraCaptureButton.setClickable(true);
//뒤로가기 버튼 클릭 시 홈화면 전환
Button back = (Button) findViewById(R.id.back);
back.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent( getApplicationContext(), DirectionActivity.class );
startActivity(intent);
}
});
// storage permission
//버전 체크
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// //파일 권한 체크
// if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
// || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// if(shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Toast.makeText(this, "외부 저장소 사용을 위해 읽기/쓰기 필요", Toast.LENGTH_SHORT).show();
// }
// requestPermissions(new String[]
// {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}, 2);
// }
// }
dialog01 = new Dialog(CamActivity.this);
dialog01.setContentView(R.layout.activity_custom_dialog);
//다이얼로그 밖의 화면은 흐리게 만들어줌
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
layoutParams.dimAmount = 0.8f;
getWindow().setAttributes(layoutParams);
showDialog01();
}
public void showDialog01(){
dialog01.show();
dialog01.findViewById(R.id.btn_shutdown).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog01.dismiss();
}
});
}
@Override
public void onRequestPermissionsResult ( int requestCode, String[] permissions,
int[] grantResults){
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//파일 권한 체크
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if(shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this, "외부 저장소 사용을 위해 읽기/쓰기 필요", Toast.LENGTH_SHORT).show();
}
requestPermissions(new String[]
{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}, 2);
}
}
switch (requestCode) {
case REQUEST_CAMERA:
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.CAMERA)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
mCameraTextureView = (TextureView) findViewById(R.id.cameraTextureView);
mPreview = new Preview(this, mCameraTextureView, mNormalAngleButton, mWideAngleButton, mCameraCaptureButton, mCameraDirectionButton);
mPreview.openCamera();
Log.d(TAG, "mPreview set");
} else {
Toast.makeText(this, "Should have camera permission to run", Toast.LENGTH_LONG).show();
finish();
}
}
}
break;
}
}
//전면으로 전환
@Override
protected void onResume () {
super.onResume();
mPreview.onResume();
}
//후면으로 전환
@Override
protected void onPause () {
super.onPause();
mPreview.onPause();
}
}
저장된 갤러리 활용
package com.example.nailmanna;
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import androidx.loader.content.CursorLoader;
public class RealPathUtil {
public static String getRealPath(Context context, Uri fileUri) {
String realPath;
// SDK < API11
if (Build.VERSION.SDK_INT < 11) {
realPath = RealPathUtil.getRealPathFromURI_BelowAPI11(context, fileUri);
}
// SDK >= 11 && SDK < 19
else if (Build.VERSION.SDK_INT < 19) {
realPath = RealPathUtil.getRealPathFromURI_API11to18(context, fileUri);
}
// SDK > 19 (Android 4.4) and up
else {
realPath = RealPathUtil.getRealPathFromURI_API19(context, fileUri);
}
return realPath;
}
@SuppressLint("NewApi")
public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
String[] proj = {MediaStore.Images.Media.DATA};
String result = null;
CursorLoader cursorLoader = new CursorLoader(context, contentUri, proj, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
result = cursor.getString(column_index);
cursor.close();
}
return result;
}
public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri) {
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = 0;
String result = "";
if (cursor != null) {
column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
result = cursor.getString(column_index);
cursor.close();
return result;
}
return result;
}
/**
* Get a file path from a Uri. This will get the the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
* other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @author paulburke
*/
@SuppressLint("NewApi")
public static String getRealPathFromURI_API19(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @param selection (Optional) Filter used in the query.
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
}
사진 불러오는 activity
package com.example.nailmanna;
import static android.content.ContentValues.TAG;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class SelecthandActivity extends AppCompatActivity {
Button test, test1, test2, test3, test4, samebutton, done;
TextView infotext, info;
String path;
// 손가락 or 전체 선택 화면
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_selecthand);
test = findViewById(R.id.test);
test1 = findViewById(R.id.test1);
test2 = findViewById(R.id.test2);
test3 = findViewById(R.id.test3);
test4 = findViewById(R.id.test4);
samebutton = findViewById(R.id.allsame);
info = findViewById(R.id.textView10);
infotext = findViewById(R.id.infotext);
done = findViewById(R.id.done);
//해시맵 값이 있을 경우 완료버튼을 보이게 하고, 다른 버튼은 invisibility하게 하기
if(commonData.getInstance().GetHandSelect(1) !=0 || commonData.getInstance().GetHandSelect(2) !=0 || commonData.getInstance().GetHandSelect(3) !=0 || commonData.getInstance().GetHandSelect(4) !=0 || commonData.getInstance().GetHandSelect(5) !=0 ) {
samebutton.setVisibility(View.GONE);
info.setVisibility(View.GONE);
infotext.setVisibility(View.GONE);
}
if(commonData.getInstance().GetHandSelect(1) == 1 && commonData.getInstance().GetHandSelect(2) == 2 && commonData.getInstance().GetHandSelect(3) == 3 && commonData.getInstance().GetHandSelect(4) == 4 && commonData.getInstance().GetHandSelect(5) == 5 ) {
done.setVisibility(View.VISIBLE);
}
//사진 불러오기
if( commonData.getInstance().GetLastImageURL() != ""){
ImageView showImage = (ImageView) findViewById(R.id.show_image);
Uri uri = Uri.parse("file:///" + commonData.getInstance().GetLastImageURL() );
showImage.setImageURI(uri);
}
// back 버튼 클릭 시 cam화면으로 전환
Button back = (Button) findViewById(R.id.back);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
commonData.getInstance().SetLeftHand(0);
Intent intent = new Intent( getApplicationContext(), DirectionActivity.class );
startActivity(intent);
}
});
// 모두동일 버튼 클릭 시 custom화면으로 전환
samebutton = findViewById(R.id.allsame);
samebutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent( getApplicationContext(), SamecustomActivity.class );
startActivity(intent);
commonData.getInstance().SetSelectNo(6);
}
});
// 완료하기 버튼 클릭 시 완료화면으로 전환
done = findViewById(R.id.done);
done.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent( getApplicationContext(), FinishActivity.class );
startActivity(intent);
}
});
//설정한 버튼 set.backgroundcolor
if( commonData.getInstance().GetHandSelect(1) == 1 ){
test.setBackgroundColor(Color.parseColor(commonData.getInstance().GetHandColor(1)));
}
if(commonData.getInstance().GetHandSelect(2) == 2 ){
test1.setBackgroundColor(Color.parseColor(commonData.getInstance().GetHandColor(2)));
}
if(commonData.getInstance().GetHandSelect(3) == 3 ){
test2.setBackgroundColor(Color.parseColor(commonData.getInstance().GetHandColor(3)));
}
if(commonData.getInstance().GetHandSelect(4) == 4 ){
test3.setBackgroundColor(Color.parseColor(commonData.getInstance().GetHandColor(4)));
}
if(commonData.getInstance().GetHandSelect(5) == 5 ){
test4.setBackgroundColor(Color.parseColor(commonData.getInstance().GetHandColor(5)));
}
//손가락에따른 버튼 클릭 시 액티비티 전환
test.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent( getApplicationContext(), CustomActivity.class );
startActivity(intent);
commonData.getInstance().SetHandSelect(1,1);
commonData.getInstance().SetSelectNo(1);
}
});
//손가락에따른 버튼 클릭 시 액티비티 전환
test1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent( getApplicationContext(), CustomActivity.class );
startActivity(intent);
commonData.getInstance().SetHandSelect(2,2);
commonData.getInstance().SetSelectNo(2);
}
});
//손가락에따른 버튼 클릭 시 액티비티 전환
test2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent( getApplicationContext(), CustomActivity.class );
startActivity(intent);
commonData.getInstance().SetHandSelect(3,3);
commonData.getInstance().SetSelectNo(3);
}
});
//손가락에따른 버튼 클릭 시 액티비티 전환
test3.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent( getApplicationContext(), CustomActivity.class );
startActivity(intent);
commonData.getInstance().SetHandSelect(4,4);
commonData.getInstance().SetSelectNo(4);
}
});
//손가락에따른 버튼 클릭 시 액티비티 전환
test4.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent( getApplicationContext(), CustomActivity.class );
startActivity(intent);
commonData.getInstance().SetHandSelect(5,5);
commonData.getInstance().SetSelectNo(5);
Log.e("handselectarray", "===>"+commonData.getInstance().GetHandSelect(1));
// for(Map.Entry<Integer, Integer> i : commonData.getInstance().GetHandSelect().entrySet() ){
// Log.i("say", "key = [ "+ i.getKey() +"] value = [" + i.getValue() +"] ");
// }
}
});
}
}
해당 기능은 제가 사용했던 싱글톤도 같이 들어가 있어서 따라하다가 이슈가 나면 바로 댓글 달아주세요.
바로 알려드릴게요! 최대 하루
728x90
반응형
'웹 & 앱 꿀 TIP' 카테고리의 다른 글
[android] 화면 간 이동하기 (0) | 2022.06.22 |
---|---|
[android] 싱글톤에 대하여 총정리_ 이것만 보면 나는 싱글톤 마스터 (0) | 2022.06.20 |
[android] 파일 권한과 카메라 권한 퍼미션 코드 공유 (0) | 2022.06.16 |
[android] editText에서 입력한 값 가지고 오기 (0) | 2022.06.16 |
[android] cardview 안될 때 (0) | 2022.06.16 |