2016-12-18 3 views
4

Ich möchte Anrufe regelmäßig zu Testzwecken machen/Empfangen von meiner android app programmatisch und sammelt Statistiken von meinem Netzwerk. Also ruft meine App immer wieder eine Nummer an und wenn der Anruf angenommen wird, beendet die App den Anruf nach ein paar Sekunden. Um damit zu beginnen, ist der Code, den ich verstanden habe, funktionieren würde. Es wählt und ruft die von mir angegebene Nummer an, ohne dass ich den Bildschirm berühren muss.Wie man einen Anruf programmatisch in android

public class MainActivity extends AppCompatActivity { 

int MY_PERMISSIONS_REQUEST_CALL_PHONE = 101; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    call(); 
} 

private void call() { 

    try { 

     Intent callIntent = new Intent(Intent.ACTION_CALL); 
     callIntent.setData(Uri.parse("tel:2125551212")); 
     System.out.println("====before startActivity===="); 



     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != 
       PackageManager.PERMISSION_GRANTED) { 

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

      return; 
     } 

     startActivity(callIntent); 
     System.out.println("=====getcallActivity==="+getCallingActivity()); 


    } catch (ActivityNotFoundException e) { 
     Log.e("helloAndroid","Call failed",e); 
    } 
} 

} 

Das Manifest enthält die folgende Zeile:

Gemäß meinem Verständnis ACTION_CALL sollte den Anruf an die Nummer stelle ich zur Verfügung gestellt haben, ohne die DIAL-Taste drücken zu müssen. Aber wirkt wie ACTION_DIAL, die die Zahl auf dem Bildschirm angezeigt und der Benutzer hat dann DIAL-Taste drücken, um den Anruf zu tätigen. Gibt es also keinen Unterschied zwischen ACTION_DIAL und ACTION_CALL?

Nachdem ich einige der Beiträge lesen Ich verstehe, dass 6.0 ab Erlaubnis braucht, ist vom Benutzer angefordert werden, um den Anruf zu wählen (was ich oben in meinem Code verwendet haben)

Meine Frage ist, wenn ich Lollipop verwenden (5.0) OS kann ich dann den Anruf tätigen, ohne zu wählen?

Antwort

8

ACTION_DIAL

Added in API-Ebene 1

String ACTION_DIAL

Aktivität Aktion: Wählen Sie eine Nummer, wie durch die Daten angegeben. Dies zeigt eine UI mit der Nummer gewählt wird, so dass der Benutzer explizit den Anruf einzuleiten.

Eingang: Wenn nichts, ein leerer Dialer gestartet wird, sonst getData() ist URI eine Rufnummer gewählt werden oder ein tel: URI eine expliziten Telefonnummer.

Ausgang: nichts.

Konstante Wert: android.intent.action.DIAL


ACTION_CALL

Added in API-Ebene 1

String ACTION_CALL

Aktivität Aktion: Einen Anruf an eine durch die Daten angegebene Person ausführen.

Eingabe: Wenn nichts, wird ein leeres Dialer gestartet; sonst ist getData() der URI einer zu wählenden Telefonnummer oder ein tel: URI einer expliziten Telefonnummer.

Ausgang: nichts.

Hinweis:

  • Es wird Einschränkungen geben, auf denen Anwendungen einen Anruf einleiten kann; Die meisten Anwendungen sollten die ACTION_DIAL verwenden.
  • Diese Absicht kann nicht verwendet werden, um Notrufnummern anzurufen. Anwendungen können Notrufnummern unter ACTION_DIAL wählen.
  • Wenn Sie App Ziele android M und höher und erklärt, wie die CALL_PHONE Erlaubnis verwendet, die nicht gewährt ist, dann diese Aktion zu nutzen versucht in einem Security führen.

Konstante Wert: android.intent.action.CALL


so dass im Grunde

Um nur die Dialer-App zu öffnen (der Benutzer hat die Ruftaste in der Dialer-App drücken, es werden keine zusätzlichen Berechtigungen erforderlich) verwenden:

String number = "7777777777"; 
Uri call = Uri.parse("tel:" + number);    
Intent surf = new Intent(Intent.ACTION_DIAL, call); 
startActivity(surf); 

Um die Dialer App und zu öffnen den Anruf automatisch ausführen (benötigt android.permission.CALL_PHONE) und dann verwenden:

String number = "7777777777"; 
Uri call = Uri.parse("tel:" + number);    
Intent surf = new Intent(Intent.ACTION_CALL, call); 
startActivity(surf); 
+0

Vielen Dank. Es funktioniert super! Kann ich das als AsyncTask einrichten? –

+1

Nicht klar, was Sie meinten, AsyncTask ist eine der einfachsten Möglichkeiten, um Parallelität in Android zu implementieren, ohne sich mit komplexeren Methoden wie Threads befassen zu müssen. Wenn Sie also parallel arbeiten wollen, können Sie es aber wählen oder anrufen Sie tun es auf dem UI-Thread, sonst wird es abstürzen.use onPostExecute, wenn Sie nach einem Prozess im Hintergrund Thread wählen möchten .. –

1

Sie können nicht wirklich einen direkten Anruf zu einer Nummer machen, wenn Sie eine Systemanwendung mit speziellen Systemberechtigungen sind. Dazu müssen Sie vom OEM vorinstalliert sein oder als System-App gerootet und installiert sein. Die Absicht, die Sie verwenden müssen, ist android.intent.action.CALL_PRIVILEGED, und die Berechtigung ist android.permission.CALL_PRIVILEGED

Der Unterschied zwischen ACTION_CALL und ACTION_DIAL ist, dass die Wahl startet mit dem Dialer nach oben.

Verwandte Themen