손전등 어플을 만들기 위해 런타임 퍼미션을 허용할 수 있도록 코드를 작성하였습니다.
다행히 권한을 요청하는 창이 표시되며 정상적으로 작동되는 듯 했지만 앱이 꺼져버립니다.
그 이유가 뭔지 알 수 있을까요? 또는 해결 방법이라도 알려주시면 감사하겠습니다.
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)