Не удается подключиться к сервису камеры при мигании вспышки - PullRequest
0 голосов
/ 19 сентября 2018

Я разрабатываю приложение для Android, которое мигает при входящем звонке и в SMS-сообщении, но проблема заключается в том, что в первый раз вспышка начинает мигать при входящем звонке или в SMS-сообщении, но во второй раз возникает исключение, что «не удается подключиться коператорский сервис " Вот мой исходный код

public class CallReceiver extends PhonecallReceiver {

    private static Camera camera =null;
    private boolean isFlashOn;
    Camera.Parameters params;
    private boolean isBlinking = false;
    String myString = "010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101";

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onIncomingCallStarted(Context ctx, String number, Date start) {

        isBlinking = true;
        setFlashBlinking(ctx);
    }


    @Override
    protected void onOutgoingCallStarted(Context ctx, String number, Date start) {
        Log.d("arsalan", "Out going call started");
        turnOffFlash();
      /*  myString = "1";
        onIncomingCallStarted(ctx, number, start);*/
    }

    @Override
    protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end) {
        Log.d("arsalan", "incoming call is ended");
        myString = "1";
        turnOffFlash();
        //onIncomingCallStarted(ctx, number, start);

    }

    @Override
    protected void onOutgoingCallEnded(Context ctx, String number, Date start, Date end) {
        Log.d("arsalan", "on out going call is ended");
    }

    @Override
    protected void onMissedCall(Context ctx, String number, Date start) {
        Log.d("arsalan", "On Missed call");
        turnOffFlash();

        // onIncomingCallStarted(ctx, number, start);
    }
    private void turnOnFlash() {
        if (!isFlashOn) {
            camera = Camera.open();
            params = camera.getParameters();
            params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            camera.setParameters(params);
            camera.startPreview();
            isFlashOn = true;
        }
    }

    private void turnOffFlash() {

        if (isFlashOn) {
           // params = camera.getParameters();
            params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
            camera.setParameters(params);
            camera.stopPreview();
            camera.release();
            camera = null;
            isFlashOn = false;
        }
    }

    public void setFlashBlinking(Context context) {

        MyPreference preference = MyPreference.getInstance(context);
        //checking that flash light is available or not
        if (FlashLight.hasFlashLight(context)) {

            long blinkDelay = preference.getCallBlinkingDelay();

            for (int i = 0; i < myString.length(); i++) {

                if (isBlinking == false) {
                    break;
                }
                if (myString.charAt(i) == '0') {
                    turnOnFlash();

                } else {
                    turnOffFlash();
                }
                try {
                    Thread.sleep(blinkDelay);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void setFlashBlinking(boolean blinking) {
        isBlinking = blinking;
    }
}

PhonecallReceiver - это абстрактный класс, расширяющий Broadcast Receiver для обнаружения входящего вызова. setFlashBlinking () * метод 1007 * используется для включения / выключения вспышки, а setFlashBlinking (boolean isBlinking) * метод 1009 * (для остановки мигания вспышки) используется для остановки цикла при получении вызова илипропущенный звонок. Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.creativelabs.flashoncallandsms">
]
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

    <permission android:name="android.permission.FLASHLIGHT"
        android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
        android:protectionLevel="normal"
      />
    <uses-feature android:name="android.hardware.camera.flash" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".BroadCastReceiver.CallReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

        <receiver android:name=".BroadCastReceiver.SmsListener">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

Как решить эту проблему «Не удалось подключиться к сервисам камеры»Спасибо за помощь:)

...