14

Tworzę aplikację do dzwonienia.Nie można odebrać połączenia przychodzącego w Androidzie marshmallow 6.0

Oto odpowiedź automatyczna, która działa na Androida 4.0 i 5.0; mając na uwadze, że kiedy mam przycisk odbierania połączenia przychodzącego działa, ale nie działa on na Androidzie 6.0.

Testowałem odpowiedzi na to stanowisko, ale to nie działa zbyt: Answer Incoming Call in Android 6.0

IncomingActivity:

@Override 
public void onClick(View v) { 
    switch (v.getId()) 
    { 
     case R.id.imgaccept: 
     { 
      if (Build.VERSION.SDK_INT >= 21) { 
       new Thread(new Runnable() { 

        @Override 
        public void run() { 

         try { 
          Runtime.getRuntime().exec("input keyevent " + KeyEvent.KEYCODE_HEADSETHOOK); 
          Intent intent = new Intent(getApplicationContext(), OutGoing.class); 
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          intent.putExtra(CommonMethods.OUTGOING_NUMBER, savedNumber); 
          startActivity(intent); 
          finish(); 
         } 
         catch (Throwable t) { 

         } 
        } 
       }).start(); 
      } 
      else { 
       Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON); 
       buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK)); 
       sendOrderedBroadcast(buttonDown, "android.permission.CALL_PRIVILEGED"); 

       Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON); 
       buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK)); 
       sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED"); 

       Intent intent = new Intent(this, OutGoing.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.putExtra(CommonMethods.OUTGOING_NUMBER, savedNumber); 
       startActivity(intent); 
       finish(); 
      } 
      break; 
     } 
     case R.id.imgdecline: 
     { 
      CommonMethods.rejectCall(this); 
      finish(); 
      break; 
     } 
     default: 
      break; 
    } 
} 
+0

Czy sprawdzanie uprawnień na Androidzie 6.0+? – Ahmed

+1

tak, sprawdzam wszystkie uprawnienia – Secret

+1

@ Secret: Czy masz na to rozwiązanie? –

Odpowiedz

5

do wielu badań, w końcu znalazłem rozwiązanie

NotificationCall.java

public class NotificationCall extends NotificationListenerService { 

@RequiresApi(api = Build.VERSION_CODES.KITKAT) 

static StatusBarNotification mysbn; 
Context context; 

public StatusBarNotification[] getActiveNotifications() { 
    return super.getActiveNotifications(); 
} 

public void onCreate() { 
    super.onCreate(); 
    this.context = getApplicationContext(); 
} 

@Override 
public void onNotificationPosted(StatusBarNotification sbn) { 
    super.onNotificationPosted(sbn); 
    mysbn = sbn; 
    try { 

     String packageName = sbn.getPackageName(); 
     Intent intent = new Intent("Msg"); 
     intent.putExtra("package", packageName); 
     LocalBroadcastManager.getInstance(this.context).sendBroadcast(intent); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

Dodaj w manifeście:

<service 
     android:name=".NotificationCall" 
     android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> 
     <intent-filter> 
      <action android:name="android.service.notification.NotificationListenerService" /> 
     </intent-filter> 
    </service> 

Zebrane na kliknięcia przycisku:

button.setOnClickListener(new View.OnClickListener() { 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
     @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) 
     @Override 
     public void onClick(View v) { 
      try { 
       for (MediaController mediaController : ((MediaSessionManager) getApplicationContext().getSystemService("media_session")).getActiveSessions(new ComponentName(getApplicationContext(), NotificationCall.class))) { 
        if ("com.android.server.telecom".equals(mediaController.getPackageName())) { 
         mediaController.dispatchMediaButtonEvent(new KeyEvent(1, 79)); 
         return; 
        } 
       } 
      } catch (SecurityException e2) { 
       e2.printStackTrace(); 
      } 
     } 
    }); 

Trzeba zaznaczyć pole wyboru Pokaż powiadomienie po prostu pójść do

Settings > Apps > All > Dialer > Check the notification box 

o zgodę:

if (Settings.Secure.getString(getContentResolver(), "enabled_notification_listeners").contains(getApplicationContext().getPackageName())) 
    { 

    } else 
     { 
     Intent i = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(i); 
    } 

Testowałem wersję upto Nougat.

Pozdrawiam!

0

Rozwiązany! Aplikacja do wybierania numeru miała usunięte pole "Pokaż powiadomienia".

Nie wiem, jak to się stało.

Dla każdego, kto przeżywa ten sam problem:

Ustawienia> Aplikacje> Wszystkie> Dialer> Zaznacz pole powiadomienia.

0

Trzeba zaznaczyć pole Pokaż powiadomienia po prostu pójść do

Settings > Apps > All > Dialer > Check the notification box