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

손전등 어플을 만드는데 권한허용후 앱이 꺼져버립니다.

0 추천

손전등 어플을 만들기 위해 런타임 퍼미션을 허용할 수 있도록 코드를 작성하였습니다.

다행히 권한을 요청하는 창이 표시되며 정상적으로 작동되는 듯 했지만 앱이 꺼져버립니다.

그 이유가 뭔지 알 수 있을까요? 또는 해결 방법이라도 알려주시면 감사하겠습니다.

public class MainActivity extends AppCompatActivity {

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

    private static final int PERMS_REQUEST_CAMERA = 0;

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

        string = "flash";
        screen = (Button) findViewById(R.id.id_screen);

        screen.setBackgroundColor(getResources().getColor(R.color.flashColor));
        screen.setText(getResources().getText(R.string.flash_text));

        if (hasPermissions()) {
            flashOn();
        } else {
            requestPerms();
        }
    }

    private boolean hasPermissions() {
        int res = 0;

        String[] permissions = new String[]{Manifest.permission.CAMERA};

        for (String perms : permissions) {
            res = checkCallingOrSelfPermission(perms);

            if (!(res == PackageManager.PERMISSION_GRANTED))
                return false;
        }
        return true;
    }

    private void requestPerms() {
        String[] permissions = new String[]{Manifest.permission.CAMERA};

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permissions, PERMS_REQUEST_CAMERA);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        //super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        boolean allowed = true;

        switch (requestCode) {
            case PERMS_REQUEST_CAMERA:
                for (int res : grantResults) {
                    allowed = allowed && (res == PackageManager.PERMISSION_GRANTED);
                }
                break;
            default:
                allowed = false;
                break;
        }

        if (allowed) {
            Toast.makeText(getApplicationContext(), "Camera permission allowed.", Toast.LENGTH_LONG).show();
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
                    Toast.makeText(getApplicationContext(), "Camera permission denied.", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

    public void flashOn() {
        camera = Camera.open();

        Camera.Parameters param = camera.getParameters();
        param.setFlashMode(Camera.Parameters.FLASH_MODE_ON);

        camera.setParameters(param);
        camera.startPreview();
    }

    public void flashOff() {
        Camera.Parameters param = camera.getParameters();
        param.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);

        camera.setParameters(param);
        camera.stopPreview();

        camera.release();
    }

    public void onScreenTouched(View v) {
        if (string.equals("screen")) {
            flashOn();
        screen.setBackgroundColor(getResources().getColor(R.color.flashColor));
            screen.setText(getResources().getText(R.string.flash_text));
            string = "flash";
        } else if (string.equals("flash")) {
            flashOff();

            screen.setBackgroundColor(getResources().getColor(R.color.screenColor));
            screen.setText(getResources().getText(R.string.screen_text));
            string = "screen";
        }
    }
}

아래는 로그캣입니다.

com.google.android.apps.gsa.shared.speech.a.g: Error reading from input stream

                       at com.google.android.apps.gsa.staticplugins.recognizer.i.a.a(SourceFile:342)
                                                                                                  at com.google.android.apps.gsa.staticplugins.recognizer.i.a$1.run(SourceFile:1367)
                                                                                                  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
                                                                                                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                                  at com.google.android.apps.gsa.shared.util.concurrent.a.ak.run(SourceFile:66)
                                                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                                                  at java.lang.Thread.run(Thread.java:761)
                                                                                                  at com.google.android.apps.gsa.shared.util.concurrent.a.ad$1.run(SourceFile:85)
                                                                                               Caused by: com.google.android.apps.gsa.shared.exception.GsaIOException: Error code: 393238 | Buffer overflow, no available space.
                                                                                                  at com.google.android.apps.gsa.speech.audio.Tee.g(SourceFile:2531)
                                                                                                  at com.google.android.apps.gsa.speech.audio.ap.read(SourceFile:555)
                                                                                                  at java.io.InputStream.read(InputStream.java:101)
                                                                                                  at com.google.android.apps.gsa.speech.audio.al.run(SourceFile:362)
                                                                                                  at com.google.android.apps.gsa.speech.audio.ak$1.run(SourceFile:471)
                                                                                                  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
                                                                                                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                                  at com.google.android.apps.gsa.shared.util.concurrent.a.ak.run(SourceFile:66)
                                                                                                  at com.google.android.apps.gsa.shared.util.concurrent.a.ax.run(SourceFile:139)
                                                                                                  at com.google.android.apps.gsa.shared.util.concurrent.a.ax.run(SourceFile:139)
                                                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                                                  at java.lang.Thread.run(Thread.java:761)
                                                                                                  at com.google.android.apps.gsa.shared.util.concurrent.a.ad$1.run(SourceFile:85)
회원탈퇴해주세요 (200 포인트) 님이 2017년 8월 18일 질문

2개의 답변

0 추천
 
채택된 답변
오류가 난 에러 메시지는 퍼미션의 문제가 아니라,

스피치 레커니션 쪽에서 오류가 난 것으로 보이네요.

google play defendency 문제 인 듯 싶네요.

구글 플레이 관련된 라이브러리들을 참조한다면, 각 라이브러리간의 버전이 서로 맞아야 동시에 사용이 가능합니다. 이것 때문에 한번씩 곤혹스럽긴 하죠. 이것 저것 조합을 해 보는 방법밖엔 없는 듯 싶네요.

참조: https://github.com/evollu/react-native-fcm/issues/360
Will Kim (43,170 포인트) 님이 2017년 8월 20일 답변
회원탈퇴해주세요님이 2017년 8월 31일 채택됨
0 추천
저랑 비슷한 경우신 것 같아서 글 남깁니다.

저 같은 경우는 매니페스트에서 권한선한했고,

런타임 퍼미션(?)을 통해서도 위험권한 요청하도록 했는데,

계속 requestpermission부분에서 앱이 중단되더라구요. 구글링해봐도 딱히 나오는 게 없고..

다른 컴퓨터에서 해봤더니 잘 되더군요!

결론은 다시 안드로이드 스튜디오를 다시 깔아보거나 다른 컴퓨터에서 실행해보심이 어떨까 싶습니다!
익명사용자 님이 2017년 11월 30일 답변
...