Wie telefoniere ich mit Absicht in Android?


329

Ich verwende den folgenden Code, um einen Anruf in Android zu tätigen, aber es gibt mir eine Sicherheitsausnahme. Bitte helfen Sie.

 posted_by = "111-333-222-4";

 String uri = "tel:" + posted_by.trim() ;
 Intent intent = new Intent(Intent.ACTION_CALL);
 intent.setData(Uri.parse(uri));
 startActivity(intent);

Berechtigungen

 <uses-permission android:name="android.permission.CALL_PHONE" />

Ausnahme

11-25 14:47:01.661: ERROR/AndroidRuntime(302): Uncaught handler: thread main exiting due to uncaught exception
11-25 14:47:01.681: ERROR/AndroidRuntime(302): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:111-333-222-4 cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{43d32508 302:com.Finditnear/10026} (pid=302, uid=10026) requires android.permission.CALL_PHONE
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.os.Parcel.readException(Parcel.java:1218)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.os.Parcel.readException(Parcel.java:1206)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1214)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.app.Activity.startActivityForResult(Activity.java:2749)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.app.Activity.startActivity(Activity.java:2855)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at com.Finditnear.PostDetail$2$1$1$1.onClick(PostDetail.java:604)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:884)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.widget.ListView.performItemClick(ListView.java:3285)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640)

Antworten:


383

Sie können Intent.ACTION_DIALanstelle von verwenden Intent.ACTION_CALL. Dies zeigt den Dialer mit der bereits eingegebenen Nummer an, ermöglicht dem Benutzer jedoch zu entscheiden, ob der Anruf tatsächlich getätigt werden soll oder nicht. ACTION_DIALerfordert keine CALL_PHONEErlaubnis.


ACTION_DIAL erfordert keine Erlaubnis, dies ist ein wichtiger Unterschied zu ACTION_CALL Intent :)
maxwellnewage

237

Diese Demo wird für Sie hilfreich sein ...

Klicken Sie beim Anrufen auf:

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Phone_number"));
startActivity(intent);

Erlaubnis im Manifest:

 <uses-permission android:name="android.permission.CALL_PHONE" />

1
+1 für "tel:". Ich hatte stattdessen einen Anruf und bekam keine Absichtsausnahme. Tnx
Tina

Dies funktioniert in meinem Nexus 4 einfach nicht. Es öffnet den Dialer mit der Telefonnummer, startet den Anruf jedoch nicht ohne Benutzerinteraktion. Irgendein Vorschlag?
MatheusJardimB

5
Was ist der Unterschied zwischen dem Code in der Frage und in dieser Antwort? Wie löst es das Problem?
Gavriel

Dies öffnet Skype für mich.
RJB

Bitte fügen Sie Anruf Telefon Laufzeit Erlaubnis auch
Raghu Krishnan R

180

Elegantere Option:

String phone = "+34666777888";
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
startActivity(intent);

5
Dies funktioniert, ohne Manifest wie die vorherige Antwort hinzuzufügen
Pavlos

4
Keine Laufzeitberechtigungen erforderlich. +1
Kike

81

Verwenden Sie die Aktion ACTION_DIAL in Ihrer Absicht. Auf diese Weise benötigen Sie keine Berechtigung. Der Grund, warum Sie die Berechtigung für ACTION_CALL benötigen, besteht darin, einen Anruf zu tätigen, ohne dass der Benutzer etwas unternimmt.

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0987654321"));
startActivity(intent);

2
Dies ist besser, wenn Sie nicht um Erlaubnis bitten müssen.
Zackygaurav

1
In der zweiten Zeile des Codes fehlt ein Semikolon. perfekte Antwort!
Ahmed_khan_89

73

Alles ist gut.

Ich habe gerade das Tag für Anrufberechtigungen vor dem Tag für die Anwendung in der Manifestdatei platziert

und jetzt funktioniert alles gut.


2
In meiner Antwort unten erfahren Sie, wie Sie fast das Gleiche erreichen können, ohne eine Erlaubnis zu benötigen und mit der Möglichkeit, dass der Benutzer den Anruf nicht tatsächlich tätigt.
Ridcully


Weitere Informationen wie von Snicolas vorgeschlagen londatiga.net/it/programming/android/…
Lorensius WL T

31

WICHTIGE NOTIZ:

Wenn Sie verwenden Intent.ACTION_CALL, müssen Sie die CALL_PHONEBerechtigung hinzufügen .

Es ist nur dann in Ordnung, wenn Sie nicht möchten, dass Ihre App in Google Play für Tablets angezeigt wird, die keine SIM-Karte akzeptieren oder kein GSM haben.

IN IHRER AKTIVITÄT:

            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
            startActivity(callIntent);

MANIFEST:

<uses-permission android:name="android.permission.CALL_PHONE" />

Wenn dies für Ihre App keine wichtige Funktion ist, versuchen Sie, keine CALL_PHONEBerechtigungen hinzuzufügen .

ANDERE LÖSUNG:

Um die Telefon-App mit der auf dem Bildschirm eingegebenen Nummer anzuzeigen, muss der Benutzer nur auf die Anruftaste klicken:

            Intent dialIntent = new Intent(Intent.ACTION_DIAL);
            dialIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
            startActivity(dialIntent);

Hierfür ist keine Erlaubnis erforderlich.


24

Nur der einfache Oneliner ohne zusätzliche Berechtigungen:

private void dialContactPhone(final String phoneNumber) {
    startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNumber, null)));
}

18

Verwenden Sie diesen vollständigen Code

          Intent callIntent = new Intent(Intent.ACTION_DIAL);
          callIntent.setData(Uri.parse("tel:"+Uri.encode(PhoneNum.trim())));
          callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          startActivity(callIntent);     

1
Diese Technik hat bei mir funktioniert, obwohl ich Intent.ACTION_DIAL in Intent.Anction_CALL ändern musste.
Naeem A. Malik

12

Erlaubnis im Manifest anfordern

<uses-permission android:name="android.permission.CALL_PHONE" />

Verwenden Sie zum Anrufen diesen Code

Intent in = new Intent(Intent.ACTION_CALL, Uri.parse("tel:99xxxxxxxx"));
try {
    startActivity(in);
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(mcontext, "Could not find an activity to place the call.", Toast.LENGTH_SHORT).show();
}

3
Ich denke, Sie benötigen keine Berechtigung, da Ihre App sich nicht selbst aufruft, sondern die dedizierte App (die über die Berechtigung verfügt) dazu auffordert.
Mostrapotski

9

Berechtigung in AndroidManifest.xml

<uses-permission android:name="android.permission.CALL_PHONE" />

Vollständiger Code:

private void onCallBtnClick(){
    if (Build.VERSION.SDK_INT < 23) {
        phoneCall();
    }else {

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

            phoneCall();
        }else {
            final String[] PERMISSIONS_STORAGE = {Manifest.permission.CALL_PHONE};
            //Asking request Permissions
            ActivityCompat.requestPermissions(mActivity, PERMISSIONS_STORAGE, 9);
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    boolean permissionGranted = false;
    switch(requestCode){
        case 9:
            permissionGranted = grantResults[0]== PackageManager.PERMISSION_GRANTED;
            break;
    }
    if(permissionGranted){
        phoneCall();
    }else {
        Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
    }
}

private void phoneCall(){
    if (ActivityCompat.checkSelfPermission(mActivity,
            Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:12345678900"));
        mActivity.startActivity(callIntent);
    }else{
        Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
    }
}

8

Berechtigungen:

<uses-permission android:name="android.permission.CALL_PHONE" />

Absicht:

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:0377778888"));
startActivity(callIntent);

6

Sie können dies auch verwenden:

String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", "");

5

Um eine Anrufaktivität mit Absichten durchzuführen, sollten Sie die entsprechenden Berechtigungen anfordern.

Dazu geben Sie Verwendungsberechtigungen in die Datei AndroidManifest.xml ein.

<uses-permission android:name="android.permission.CALL_PHONE" />

Fügen Sie dann den folgenden Code in Ihre Aktivität ein

if (ActivityCompat.checkSelfPermission(mActivity,
        Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
    //Creating intents for making a call
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setData(Uri.parse("tel:123456789"));
    mActivity.startActivity(callIntent);

}else{
    Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
}

4

Für Anrufe vom Dialer (keine Erlaubnis erforderlich):

   fun callFromDailer(mContext: Context, number: String) {
        try {
            val callIntent = Intent(Intent.ACTION_DIAL)
            callIntent.data = Uri.parse("tel:$number")
            mContext.startActivity(callIntent)
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(mContext, "No SIM Found", Toast.LENGTH_LONG).show()
        }
    }

Für direkten Anruf von der App (Erlaubnis erforderlich):

  fun callDirect(mContext: Context, number: String) {
        try {
            val callIntent = Intent(Intent.ACTION_CALL)
            callIntent.data = Uri.parse("tel:$number")
            mContext.startActivity(callIntent)
        } catch (e: SecurityException) {
            Toast.makeText(mContext, "Need call permission", Toast.LENGTH_LONG).show()
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(mContext, "No SIM Found", Toast.LENGTH_LONG).show()
        }
    }

Genehmigung:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

3

Um dies zu vermeiden, können Sie über die GUI Berechtigungen eingeben. Eclipse kümmert sich darum, wo das Berechtigungs-Tag eingefügt werden soll, und ist häufig nicht korrekt


2
// Java
String mobileNumber = "99XXXXXXXX";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL); // Action for what intent called for
intent.setData(Uri.parse("tel: " + mobileNumber)); // Data with intent respective action on intent
startActivity(intent);

// Kotlin
val mobileNumber = "99XXXXXXXX"
val intent = Intent()
intent.action = Intent.ACTION_DIAL // Action for what intent called for
intent.data = Uri.parse("tel: $mobileNumber") // Data with intent respective action on intent
startActivity(intent)

1

In Android müssen Sie für bestimmte Funktionen die Berechtigung zur Manifest-Datei hinzufügen.

  1. Gehen Sie zu den Projekten AndroidManifest.xml
  2. Klicken Sie auf die Registerkarte Berechtigungen
  3. Klicken Sie auf Hinzufügen
  4. Wählen Sie Verwendungsberechtigung
  5. Siehe den Schnappschuss untenGeben Sie hier die Bildbeschreibung ein

6.Speichern Sie die Manifestdatei und führen Sie dann Ihr Projekt aus. Ihr Projekt sollte jetzt wie erwartet ausgeführt werden.


1
Welche IDE verwenden Sie?
SHA2NK

1
11-25 14:47:01.681: ERROR/AndroidRuntime(302): blah blah...requires android.permission.CALL_PHONE

^ Die Antwort liegt in der Ausnahmeausgabe " requires android.permission.CALL_PHONE" :)


1
    final public void Call(View view){

    try {

        EditText editt=(EditText)findViewById(R.id.ed1);
        String str=editt.getText().toString();
        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+str));
        startActivity(intent);
    }
    catch (android.content.ActivityNotFoundException e){

        Toast.makeText(getApplicationContext(),"App failed",Toast.LENGTH_LONG).show();
    }

1
 if(ContextCompat.checkSelfPermission(
        mContext,android.Manifest.permission.CALL_PHONE) != 
              PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions((Activity) mContext, new 
                  String[]{android.Manifest.permission.CALL_PHONE}, 0);
                } else {
                    startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Number")));
                }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.