2015-01-26 39 views
5

Ich bekomme ActivityNotFoundException, wenn ich die Intent.ACTION_CALL-Operation durchführe. Ich fand viele Links, aber alles konnte mein Problem nicht lösen.ActivityNotFoundException beim Aufruf von Intent.ACTION_CALL

Es gibt mir manchmal Ausnahme wie

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx pkg=com.android.phone (has extras) } 

Ich habe

String contact_number="123456789"; 
Intent callIntent = new Intent(Intent.ACTION_CALL); 
callIntent.setData(Uri.parse("tel:" + contact_number)); 
startActivity(callIntent); 
+0

Ist 'ACTION_DIAL' nicht der richtige? Ich glaube nicht, dass Sie einen Anruf ohne Benutzereingaben starten können. – TheRedFox

+0

Sie rufen die Nummer an - also welchen Eingang brauchen Sie, wenn Sie ihn schon haben? –

+0

Ich bekomme Kontaktnummer von Benutzereingabe, es war nur ein Beispiel, das ich in meiner Frage verwendet habe. Ich kann ACTION_DIAL nicht verwenden, weil ich anrufen muss, ohne die Einwahl zu zeigen –

Antwort

8

den folgenden Code in meinem Projekt verwendet werden, sollten Sie überprüfen, ob es irgendwelche Aktivitäten, die diese Absicht behandeln, bevor es beginnt. Dies kann passieren, wenn Ihre App nur auf einem Tablet mit WLAN ausgeführt wird und keine Telefonfunktion zur Verfügung steht. Wenn Sie nur den Dialer starten möchten, verwenden Sie besser ACTION_DIAL als ACTION_CALL, wodurch der Anruf direkt von Ihrer App aus erfolgt.

final Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:")); 
if (dialIntent.resolveActivity(context.getPackageManager()) != null) { 
    // put your logic to launch call app here 
    } 
+0

Welcher Teil meiner Antwort ist falsch? Ich habe nichts über die Erlaubnis erwähnt. Und offizielle Dokumentation empfiehlt auch ACTION_DIAL über ACTION_CALL http://developer.android.com/reference/android/content/Intent.html#ACTION_CALL – hidro

+0

Ich habe bereits die Berechtigung Ich kann ACTION_DIAL nicht verwenden, weil ich den Kontakt direkt anrufen muss, ohne eine Einwahl zu zeigen. –

+0

Dieses Problem trat in LG Nexus-4 Version (5.0.1) nicht in Tablet auf –

12

Es gibt keine Garantie, dass gegebene Absicht gehandhabt werden können (das heißt Tabletten können nicht Telefonie App überhaupt haben). Wenn es keine Anwendung mit intent-filter gibt, die Ihrer Absicht entspricht, werden Sie auf ActivityNotFoundException Ausnahme stoßen. Der richtige Ansatz ist, dies zu beachten und nutzen try/catch den Absturz zu besiegen und sich richtig erholen:

try { 
    String contact_number="123456789"; 
    Intent callIntent = new Intent(Intent.ACTION_CALL); 
    callIntent.setData(Uri.parse("tel:" + contact_number)); 
    startActivity(callIntent); 
} catch (Exception e) { 
    // no activity to handle intent. show error dialog/toast whatever 
} 

Auch sollten Sie lieber ACTION_DIAL stattdessen verwenden, wie ACTION_CALL zusätzliche Genehmigung erforderlich ist.

+1

Ich glaube nicht, mit Try-Catch würde ich mein Problem lösen –

+0

Das hat für mich funktioniert, –

5

Ich habe dieses Problem gelöst. Ich habe den folgenden Code

String contact_number="123456789"; 
Intent callIntent = new Intent(Intent.ACTION_CALL); 
intent.setPackage("com.android.phone"); 
callIntent.setData(Uri.parse("tel:" + contact_number)); 
startActivity(callIntent); 

Ich habe diese Linie für Lollipop

intent.setPackage("com.android.phone"); 

mit

intent.setPackage("com.android.server.telecom"); 
0

ersetzt verwendet dies ist mein Code.

if (BuildUtil.isAndroidM()) { 
     if (ActivityCompat.checkSelfPermission(mActivity, 
       Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(mActivity, PermissionUtil.requestPermissionFineAndCoarse(), 
        PHONE_REQUEST_CODE); 
     } 
    } else { 
     Intent callIntent = new Intent(Intent.ACTION_CALL); 
     if (BuildUtil.isAndroidL()) { 
      callIntent.setPackage("com.android.server.telecom"); 
     } else { 
      callIntent.setPackage("com.android.phone"); 
     } 
     callIntent.setData(Uri.parse("tel:" + phone)); 
     startActivity(callIntent); 
    } 
Verwandte Themen