마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

손전등 앱을 만드는데 위험 권한 허용 요청할줄 아시는 분 계시나요?

0 추천
package com.bqlab.simplight;

import android.Manifest;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import static android.media.MediaRecorder.VideoSource.CAMERA;

public class MainActivity extends AppCompatActivity {

    String string = null;
    Button screen = null;
    Camera camera = null;

    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        string = "flash";

        camera = Camera.open();
        screen = (Button) findViewById(R.id.StrongScreen);

        if (permissionCheck == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA);
        } else {
            Toast.makeText(this, "Camera permission authorized", Toast.LENGTH_SHORT).show();
        }
    }

    protected void onScreenTouched(View v) {
        Camera.Parameters param = camera.getParameters();

        if (string.equals("flash")) {
            param.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);

            camera.stopPreview();
            camera.release();

            screen.setBackgroundColor(getResources().getColor(R.color.screenColor));
            screen.setText("화면의 빛으로 비추세요.");

            string = "screen";
        }

        else if (string.equals("screen")) {
            screen.setBackgroundColor(getResources().getColor(R.color.flashColor));
            screen.setText("손전등이 켜져 있습니다.");

            param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            camera.setParameters(param);
            camera.startPreview();

            string = "flash";
        }
    }
}

안드로이드 연습겸 손전등 앱을 만들고 있는데, 손전등 어플에 필요한 플래쉬가 카메라 권한이 필요하다는 것을 알았습니다.

문제는 카메라 권한이 위험권한에 속하기 때문에 특별히 권한 요청을 묻는 코드를 작성해야한다고 하더군요.

카메라를 사용하려고 하니 '앱이 중지되었습니다'라는 문구가 나오길래 위와 같이 권한요청 코드를 넣었더니 또 중지되었습니다.

메니페스트로 허용(uses-permission)은 해놓았고, 로그캣을 아래에 첨부할테니 도와주시면 정말 감사하겠습니다.

                                                                   --------- beginning of crash
08-16 00:49:18.240 2986-2986/com.bqlab.simplight E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: com.bqlab.simplight, PID: 2986
                                                                   java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.bqlab.simplight/com.bqlab.simplight.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Context.checkPermission(java.lang.String, int, int)' on a null object reference
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                       at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                       at android.os.Looper.loop(Looper.java:148)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Context.checkPermission(java.lang.String, int, int)' on a null object reference
                                                                       at android.content.ContextWrapper.checkPermission(ContextWrapper.java:637)
                                                                       at android.support.v4.content.ContextCompat.checkSelfPermission(ContextCompat.java:432)
                                                                       at com.bqlab.simplight.MainActivity.<init>(MainActivity.java:22)
                                                                       at java.lang.Class.newInstance(Native Method)
                                                                       at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                       at android.os.Looper.loop(Looper.java:148) 
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                       at java.lang.reflect.Method.invoke(Native Method) 
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
08-16 00:49:24.302 2986-2986/com.bqlab.simplight I/Process: Sending signal. PID: 2986 SIG: 9

 

회원탈퇴해주세요 (200 포인트) 님이 2017년 8월 16일 질문

1개의 답변

0 추천
 
채택된 답변
마시멜로우 7.0 부터는 런타임퍼미션이 적용됩니다.

런타임 퍼미션관 련한 라이브러리들이 많이 있으니 찾아보시기 바랍니다.

 

하나 추천하자면

https://github.com/Karumi/Dexter
익명사용자 님이 2017년 8월 16일 답변
회원탈퇴해주세요님이 2017년 8월 31일 채택됨
...