본문 바로가기

웹 & 앱 꿀 TIP

[android] 파일 권한과 카메라 권한 퍼미션 코드 공유

728x90
반응형

한번에 요청하려는데 계속 하나만 요청되고 연달아 동작이 잘 안돼서 고민했다가 야매(?)로 해결한 거같다.. 코드만 필요하시면 가져가세염

 

전체코드공유>

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();
    }




}

 

퍼미션 허용 코드

  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;
    }
}

말 안해도 다 아시겠지만 위에 WindowManager.LayoutParams layoutParams는 onCreate안의 함수이다.

728x90
반응형