Служба не работает с Oreo 8.1 - Детектор не работает и не работает в фоновом режиме - PullRequest
0 голосов
/ 28 июня 2018

Мое приложение детектора вызовов работает нормально на всех версиях Android, кроме 8 Oreo. Я получаю парадигму тупика: мой детектор не вызывается, и когда я закрываю приложение, система убивает его, не оставляя в фоновом режиме.

Я уже прочитал документацию от кабеля к хвосту https://developer.android.com/about/versions/oreo/background, Я уже много смотрел в Google, и здесь, в стеке над потоком, но решение не применимо к моему случаю, из-за требуемых "опасных" разрешений .

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

Как правильно решить эту проблему?

manifest.xml:

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />

<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">
    <service
        android:name=".CallDetectionService"
        android:enabled="true"
        android:exported="false"/>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

CallDetectionService.java

public class CallDetectionService extends Service {

    private CallDetector callDetector;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        callDetector = new CallDetector(this);
        int r = super.onStartCommand(intent, flags, startId);
        callDetector.start();
        return r;

    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        callDetector.stop();
    }



    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

CallDetector.java

public class CallDetector {
    public static final String MY_PREF = "MY_PREF";
    public static final String NUMBER_KEY = "NUMBER_KEY";

    private SharedPreferences sharedPreferences;

    public class OutgoingDetector  extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);


            String compare_num = "12345678";
            if (number.equals(compare_num)) {
                Intent i = new Intent(context, MainActivity.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                setResultData(null);
                context.startActivity(i);
            }
        }
    }

    private Context ctx;
    private OutgoingDetector outgoingDetector;

    public CallDetector(Context ctx) {
        this.ctx = ctx;
        outgoingDetector = new OutgoingDetector();
    }

    public void start() {
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
        ctx.registerReceiver(outgoingDetector, intentFilter);
    }

    public void stop(){
        ctx.unregisterReceiver(outgoingDetector);
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Button button;
    private TextView textView;
    private boolean detecting = false;
    private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 0;


    public boolean isPermissionGranted() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(android.Manifest.permission.CALL_PHONE)
                    == PackageManager.PERMISSION_GRANTED) {
                Log.v("TAG", "Permission is granted");
                return true;

            } else {

                Log.v("TAG", "Permission is revoked");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                return false;
            }
        } else { 
            Log.v("TAG", "Permission is granted");
            return true;
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        /* button.setOnClickListener(this); */


        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED) {


            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                    Manifest.permission.CALL_PHONE)) {



            } else {


                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.CALL_PHONE},
                        MY_PERMISSIONS_REQUEST_CALL_PHONE);


            }
        }

        String action = "START";
        final Intent intent = new Intent(this, CallDetectionService.class);
        intent.setAction(action);
        startService(intent);

    }




    @Override

    public void onResume() {
        super.onResume();
        SharedPreferences sharedPreferences = getSharedPreferences(CallDetector.MY_PREF, MODE_PRIVATE);
        String number = sharedPreferences.getString(CallDetector.NUMBER_KEY, "URA VISUAL");
        textView.setText(number);
    }

}

Что я делаю не так? Я искал решение 4 дня и до сих пор ничего не нашел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...