К сожалению, приложение остановлено, разрешение разрешается или запрещается после разрешения, оно работает, но в начале я получаю всплывающее окно о том, что мое приложение остановлено.

Я пытаюсь запросить разрешение камеры, но всякий раз, когда я запускаю свой проект, мое приложение сначала прекращает всплывать, а затем показывает параметр «разрешить или запретить», если я нажму «никогда не показывать снова», он не позволит мне нажать «разрешить». И если я разрешаю запуск моего приложения, оно существует, и мне снова приходится открывать приложение. Но проблема исчезнет, ​​и мое приложение будет работать отлично при следующей попытке. вот логарифм

и вот мой MainActivity.java

Примечание. Разрешение камеры уже задано в файле Manifest.xml.

 package com.example.android.camerapermission;

import android.Manifest;
import android.content.DialogInterface;

import android.content.pm.PackageManager;
import android.hardware.Camera;

import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.test.mock.MockPackageManager;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;

import com.nispok.snackbar.Snackbar;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CAMERA = 0;


    ImageButton imageButton;
    Camera camera;
    Camera.Parameters parameters;
    boolean isflash = false;
    boolean isOn = false;


    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageButton = (ImageButton) findViewById(R.id.imageButton);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[] {Manifest.permission.CAMERA}, 0);
            }
        }
        if (getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH))
            ;

        {
            camera = Camera.open();
            parameters = camera.getParameters();
            isflash = true;

        }


        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                if (isflash) {

                    if (!isOn) {
                        imageButton.setImageResource(R.drawable.on);
                        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                        camera.setParameters(parameters);
                        camera.startPreview();
                        isOn = true;

                    } else {
                        imageButton.setImageResource(R.drawable.off);
                        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                        camera.setParameters(parameters);
                        camera.stopPreview();
                        isOn = false;
                    }


                } else {
                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setTitle("Error.....");
                    builder.setMessage("Flashlight is not available on this device...");
                    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                            dialog.dismiss();
                            finish();
                        }
                    });

                    AlertDialog alertDialog = builder.create();
                    alertDialog.show();
                }

            }
        });


    }

    public void showCamera(View view) {

        Log.i(TAG, "Show that camera button is clicked. Checking permission.");
        /**
         * Include camera permission and
         * check if camera is available in phone or not
         */
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            // Camera permission is not granted yet
            requestCameraPermission();
        } else {
            //Camera is available, show the camera preview

            Log.i(TAG, "CAMERA permission has granted, displaying camera preview");
            showCameraPreview();
        }

    }

    /**
     * Request the Camera Permission again in the case of user mistakenly denied permission.
     * Create a SnackBar that will prompt the user to grant the permission, otherwise it is requested direcly.
     */

    private void requestCameraPermission() {
        Log.i(TAG, " Camera permission is still not granted. Requesting permission.");

        //Start (camera_permission_request)
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.CAMERA)) {
            // show an additional request to the user if the permission was not granted earlier.


        } else {
            //Camera permission has not been granted yet. Request directly.
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
        }
        // END (camera_permission_request)
    }


    private void showCameraPreview() {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
                .commit();
    }


    /**
     * Receiving permission after granted
     */

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

        if (requestCode == REQUEST_CAMERA) {
            //Begin request (permission_result)
            //Recieved permission result for the camera permission.
            Log.i(TAG, "Request for Camera permission is received. ");

            //Check if the only required permission has been granted
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //Camera permission is safely granted, now you can preview.
                Log.i(TAG, "Camera permission has succesfully granted, preview is being displayed");


            } else {
                Log.i(TAG, "CAMERA permission is not granted.");

                // Finish(permission_result)
            }

            super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        }

    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();

        parameters = camera.getParameters();
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        camera.setParameters(parameters);
        camera.stopPreview();
        isflash = false;

        if (camera != null) {
            camera.release();
            camera = null;
        }
    }
}

Вам нужно заключить вызов камеры в try catch.


person Arjun Thakuri    schedule 26.07.2017    source источник
comment
Я думаю, вам нужно запросить разрешение на чтение и запись ExternalStorage для использования камеры. потому что после захвата, когда камера сохранит изображение, вы должны получить разрешение на запись. В этом примере также используется разрешение на запись (не во время выполнения, а в манифесте) — androidhive.info/2013/09/android-working-with-camera-api   -  person Arjun Thakuri    schedule 26.07.2017
comment
Проблема все еще появляется. к сожалению, я не смог вставить код из-за ограничения символов.   -  person Vishal Chhodwani    schedule 26.07.2017


Ответы (2)


С веб-сайта разработчика Android,

try {
        c = Camera.open(); // attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
    }

Давайте разберем это, это ваш код:

Caution: Always check for exceptions when using Camera.open(). Failing to check for exceptions if the camera is in use or does not exist will cause your application to be shut down by the system.
person Kevin Desai    schedule 26.07.2017
comment
Я удалил его, но проблема все еще появляется. - person Arjun Thakuri; 26.07.2017

Вот что происходит.

1.  if (getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH))
2.      ;
3.  {
        camera = Camera.open();
        parameters = camera.getParameters();
        isflash = true;
    }

Чтобы исправить это, удалите лишнюю точку с запятой в строке 2 и следите за своими точками с запятой в будущем.

1.  // If the system has a camera flash
2.  // Do nothing. The condition terminates here.
3.  // Open camera in any case.

да. Я тестирую это на своем телефоне 7.1.2 и тестирую 6.0 в эмуляторе. Та же проблема.

person Eugen Pechanec    schedule 26.07.2017
comment
Вы проверяете наличие разрешений, но затем пытаетесь открыть камеру независимо от результата проверки разрешений. Отсутствует блок else вокруг камеры. Или, может быть, переключить его. Зачем вообще спрашивать разрешения, если в устройстве нет камеры? - person Arjun Thakuri; 26.07.2017
comment
07-26 18:41:56.080 3003-3003/com.example.android.camerapermission E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.android.camerapermission, PID: 3003 java.lang.RuntimeException: невозможно начать действие ComponentInfo{com.example.android.camerapermission/com.example.android.camerapermission.MainActivity}: java.lang.RuntimeException: не удалось подключиться к службе камеры на android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) на android .app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) в android.app.Activit yThread.-wrap11(ActivityThread.java) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) в android.os.Handler.dispatchMessage(Handler.java:102) в android.os.Looper.loop( Looper.java:148) в android.app.ActivityThread.main(ActivityThread.java:5417) в java.lang.reflect.Method.invoke(собственный метод) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run( ZygoteInit.java:726) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Вызвано: java.lang.RuntimeException: не удалось подключиться к службе камеры на android.hardware.Camera.(Camera.java:495) на android .аппаратное обеспечение. Camera.open(Camera.java:356) в com.example.android.camerapermission.MainActivity.onCreate(MainActivity.java:52) в android.app.Activity.performCreate(Activity.java:6237) в android.app.Instrumentation .callActivityOnCreate(Instrumentation.java:1107) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  в android.app.ActivityThread.-wrap11(ActivityThread .j ava) на android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) на android.os.Handler.dispatchMessage(Handler.java:102) на android.os.Looper.loop(Looper.java:148) на android.app.ActivityThread.main(ActivityThread.java:5417) на java.lang.reflect.Method.invoke(собственный метод) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) - person Eugen Pechanec; 26.07.2017