Android Studio 3.2.1: приложение переключается в тихом режиме при нажатии, даже если в коде нет ошибок - PullRequest
0 голосов
/ 01 декабря 2018

Я только начинаю изучать кодирование для Android-приложения, следуя книге «Разработка Android-приложений для чайников», чтобы создать приложение переключения в тихом режиме.

В коде все выглядит нормально (нет ошибки, кроме предупреждения о том, что:


"Приведение 'findViewById (R.id.phone_icon)' к 'ImageView' является избыточным. Эта проверка сообщает о ненужных выражениях приведения."


Я прочиталподобная проблема здесь ( Сбои приложения - Переключение в тихом режиме - Android для чайников ), и он говорит, чтобы попытаться:

1) Изменить "расширяет ActionBarActivity", чтобы просто "расширяет активность" и импортировать - шахта уже есть.

2) удалить или прокомментировать 'if' в методе onCreate out - у шахты нет этого раздела.

3) изменить параметр setContentView на: R.layout.fragment_main - не очень уверен, что это значит, но, похоже, не имеет отношения к моему коду? (его коды и мой немногоразные)

MainActivity.java код

package com.dummies.silentmodetoggle;

import android.app.Activity;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

import com.dummies.silentmodetoggle.util.RingerHelper;

public class MainActivity extends Activity {

AudioManager audioManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);

    setContentView(R.layout.activity_main);

    FrameLayout contentView =
            (FrameLayout) findViewById(R.id.content);


    contentView.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            RingerHelper.performToggle(audioManager);


            updateUi();
        }
    });
}


private void updateUi() {

    ImageView imageView = (ImageView) findViewById(R.id.phone_icon);

    int phoneImage = RingerHelper.isPhoneSilent(audioManager)
            ? R.mipmap.ringer_off
            : R.mipmap.ringer_on;


    imageView.setImageResource(phoneImage);
    }

@Override
protected void onResume(){
    super.onResume();

    // Update our UI in case anything has changed.
    updateUi();
    }
}

RingerHelper.java

В книге говорится, что создать файл Java по адресу: "src / main/java/com/dummies/silentmodetoggle/util/RingerHelper.java "но не указали, как это сделать.Так как у меня нет папки util, поэтому я создал пакет (New> Package) в "src / main / java / com.dummies.silentmodetoggle" и добавил в папку util файл Java RingerHelper.Обратите внимание, если это проблема?Код выглядит следующим образом:

package com.dummies.silentmodetoggle.util;

import android.media.AudioManager;

public class RingerHelper {
// private to prevent users from creating a RingerHelper object
private RingerHelper(){}

/* Toggles the phone's silent mode */
public static void performToggle(AudioManager audioManager) {
    // If the phone is currently silent, then unsilence it. If
    //  it's currently normal, then silence it.
    audioManager.setRingerMode(
            isPhoneSilent(audioManager)
                    ? AudioManager.RINGER_MODE_NORMAL
                    : AudioManager.RINGER_MODE_SILENT);
}

/* Returns whether the phone is currently in silent mode. */
public static boolean isPhoneSilent(AudioManager audioManager){
    return audioManager.getRingerMode()
            == AudioManager.RINGER_MODE_SILENT;
}
}

Ошибка LogCat при нажатии кнопки приложения

2018-12-01 22:11:44.029 30122-30122/com.dummies.silentmodetoggle E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.dummies.silentmodetoggle, PID: 30122
java.lang.SecurityException: Not allowed to change Do Not Disturb state
    at android.os.Parcel.readException(Parcel.java:1683)
    at android.os.Parcel.readException(Parcel.java:1636)
    at android.media.IAudioService$Stub$Proxy.setRingerModeExternal(IAudioService.java:962)
    at android.media.AudioManager.setRingerMode(AudioManager.java:1022)
    at com.dummies.silentmodetoggle.util.RingerHelper.performToggle(RingerHelper.java:13)
    at com.dummies.silentmodetoggle.MainActivity$1.onClick(MainActivity.java:60)
    at android.view.View.performClick(View.java:5610)
    at android.view.View$PerformClick.run(View.java:22265)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
2018-12-01 22:11:44.672 1315-1315/? E/EGL_emulation: tid 1315: eglCreateSyncKHR(1901): error 0x3004 (EGL_BAD_ATTRIBUTE)

В противном случае приложение работает нормально, т.е.когда я нажимаю кнопку громкости на самом устройстве, чтобы отключить звук, изображение приложения изменится на тихое и наоборот.Он просто падает, когда я пытаюсь нажать на изображение самого приложения.

Я действительно понятия не имею, что происходит.Пожалуйста помоги.Большое спасибо!

1 Ответ

0 голосов
/ 27 декабря 2018

Вам необходимо добавить разрешения для режима «Не беспокоить».Я столкнулся с той же проблемой, и я добавил следующие строки в мой код Main_Activity.java в методе onCreate, и теперь он работает нормально:

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    if(notificationManager.isNotificationPolicyAccessGranted())
    {
        Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
        startActivity(intent);
    }
...