Frage

Ich bin mit dem folgenden Code einen Aufruf in Android zu machen, aber es gibt mir Sicherheit Ausnahme bitte Hilfe.

 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)
War es hilfreich?

Lösung 4

Alles ist in Ordnung.

i-Tag nur für getätigte Anrufe Berechtigungen vor der Anwendung Tag in Manifest-Datei

und jetzt alles funktioniert gut.

Andere Tipps

Sie können Intent.ACTION_DIAL anstelle von Intent.ACTION_CALL. Dies zeigt der Dialer mit der Anzahl bereits eingegeben, sondern ermöglicht es der Benutzer zu entscheiden, ob sie tatsächlich den Anruf tätigen oder nicht. ACTION_DIAL nicht die CALL_PHONE Genehmigung erforderlich ist.

Diese Demo wird hilfreich für Sie ...

Auf Ruftaste Klick:

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

Die Erlaubnis in Manifest:

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

Weitere elegante Option:

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

Verwenden Sie die Aktion ACTION_DIAL in Ihrer Absicht, auf diese Weise werden Sie keine Genehmigung benötigen. Der Grund, warum Sie die Erlaubnis, mit ACTION_CALL müssen, ist um einen Anruf zu tätigen, ohne Zutun des Benutzers.

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

Wichtiger Hinweis:

Wenn Sie Intent.ACTION_CALL verwenden, müssen Sie CALL_PHONE Erlaubnis hinzufügen.

Die okey nur, wenn Sie nicht möchten, dass Ihre App in Google Play für Tabletten zeigen, bis die SIM-Karte nicht nehmen oder nicht GSM hat.

in Ihrer Tätigkeit:

            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" />

Also, wenn es nicht kritisch Funktion der App ist, versuchen zu bleiben weg von CALL_PHONE Erlaubnis hinzufügen.

andere Lösung:

Ist das Telefon App mit der Nummer in auf dem Bildschirm geschrieben zu zeigen, so Benutzer nur Ruftaste benötigen klicken:

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

Keine Berechtigung für diese benötigt werden.

Nur der einfache oneliner ohne zusätzliche Berechtigungen benötigt:

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

Mit diesem 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);     

Anfrage Permission in manifest

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

für den Aufruf Verwendung dieses 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();
}

Berechtigungen:

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

Intent:

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

Die Erlaubnis in AndroidManifest.xml

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

Kompletter 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();
    }
}

Sie können damit auch:

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

Für eine Anrufaktivität machen Absichten verwenden, sollten Sie die entsprechenden Berechtigungen anfordern.

Für das Sie verwendet, um Berechtigungen in AndroidManifest.xml Datei enthalten.

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

schließen Sie dann den folgenden Code in Ihrer Aktivität

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();
}

Um dies zu vermeiden - man die GUI für die Eingabe von Berechtigungen verwenden kann. Eclipse kümmert sich um, wo die Erlaubnis Tag eingefügt werden und öfter dann nicht korrekt ist

In Android für bestimmte Funktionalitäten Sie die Berechtigung für die Manifest-Datei hinzufügen müssen.

  1. Gehen Sie auf die Projekte AndroidManifest.xml
  2. Klicken Sie auf die Registerkarte Berechtigungen
  3. Klicken Sie auf Hinzufügen
  4. Wählen Verwendet Permission
  5. Sehen Sie die Snapshot unter Bildbeschreibung hier eingeben

6.Save die Manifest-Datei und dann Ihr Projekt aus. Ihr Projekt sollte nun laufen wie erwartet.

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

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

    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();
    }
 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")));
                }

Für Anruf von Dialer (keine Genehmigung 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 die direkten Aufruf von app (Permission 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()
        }
    }

Permission:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top