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)
UMAR
quelle

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.

Lächerlich
quelle
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" />
Denny Sharma
quelle
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);
cprcrack
quelle
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);
Wheeliez
quelle
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.

UMAR
quelle
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
3
Beachten
Sie auch
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.

MBH
quelle
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)));
}
Artemiy
quelle
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);     
Osama Ibrahim
quelle
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();
}
Abhay Anand
quelle
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();
    }
}
Atif Mahmood
quelle
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);

quelle
6

Sie können dies auch verwenden:

String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", "");
Áron Pável
quelle
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();
}
Codemaker
quelle
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>
Shohan Ahmed Sijan
quelle
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

SaKet
quelle
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)
Sumit Jain
quelle
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.

MindBrain
quelle
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" :)

Charlie Scott-Skinner
quelle
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();
    }
Deepak Singh
quelle
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")));
                }
Mohsinali
quelle