سؤال

أنا أستخدم الكود التالي لإجراء مكالمة في Android ، لكنه يمنحني استثناءً من الأمان ، الرجاء المساعدة.

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

أذونات

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

استثناء

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)
هل كانت مفيدة؟

المحلول 4

كل شيء على ما يرام.

أنا فقط وضعت علامة أذونات المكالمات قبل علامة التطبيق في ملف البيان

والآن كل شيء يعمل بشكل جيد.

نصائح أخرى

يمكنك استخدام Intent.ACTION_DIAL بدلاً من Intent.ACTION_CALL. يوضح هذا الاتصال بالرقم الذي تم إدخاله بالفعل ، لكنه يسمح للمستخدم بتحديد ما إذا كان سيتم إجراء المكالمة بالفعل أم لا. ACTION_DIAL لا يتطلب CALL_PHONE الإذن.

هذا العرض التوضيحي سوف يساعدك ...

على زر الاتصال انقر:

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

إذن في الظهور:

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

خيار أكثر أناقة:

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

استخدم Action Action_dial في نيتك ، وبهذه الطريقة لن تحتاج إلى أي إذن. السبب في أنك بحاجة إلى الإذن باستخدام Action_Call هو إجراء مكالمة هاتفية دون أي إجراء من المستخدم.

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

ملاحظة مهمة:

كما ترى Intent.ACTION_CALL يجب أن تضيف CALL_PHONE الإذن.

إنه فقط إذا كنت لا تريد أن يظهر تطبيقك في Google Play للأجهزة اللوحية التي لا تأخذ بطاقة SIM أو لا تحتوي على GSM.

في نشاطك:

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

قائمة:

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

لذلك إذا لم تكن ميزة مهمة لتطبيقك ، فحاول الابتعاد عن الإضافة CALL_PHONE الإذن.

حل آخر:

هو عرض تطبيق الهاتف مع الرقم المكتوب على الشاشة ، لذلك سوف يحتاج المستخدم فقط إلى النقر فوق زر الاتصال:

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

لا يوجد إذن مطلوب لهذا الغرض.

فقط oneliner البسيطة دون أي أذونات إضافية مطلوبة:

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

استخدم هذا الرمز الكامل

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

طلب إذن في البيان

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

للاتصال ، استخدم هذا الرمز

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

أذونات:

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

نية:

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

إذن في AndroidManifest.xml

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

رمز كامل:

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

يمكنك استخدام هذا أيضًا:

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

لإجراء نشاط مكالمة باستخدام النوايا ، يجب عليك طلب الأذونات المناسبة.

لذلك ، يمكنك تضمين استخدامات الأذونات في ملف AndroidManifest.xml.

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

ثم قم بتضمين الكود التالي في نشاطك

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

لتجنب هذا - يمكن للمرء استخدام واجهة المستخدم الرسومية لإدخال الأذونات. يعتني Eclipse بمكان إدراج علامة الإذن وفي كثير من الأحيان لا يكون ذلك صحيحًا

في Android لبعض الوظائف ، تحتاج إلى إضافة الإذن إلى ملف البيان.

  1. انتقل إلى المشاريع AndroidManifest.xml
  2. انقر فوق علامة تبويب الأذونات
  3. انقر فوق إضافة
  4. اختيار يستخدم إذن
  5. انظر اللقطة أدناهenter image description here

6.Save ملف البيان ثم قم بتشغيل مشروعك. يجب أن يعمل مشروعك الآن كما هو متوقع.

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

^ الإجابة تكمن في إخراج الاستثناء "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")));
                }

للاتصال من Dialer (لا يلزم إذن):

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

للاتصال المباشر من التطبيق (الإذن المطلوب):

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

الإذن:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top