Android에서 의도를 사용하여 전화를 거는 방법은 무엇입니까?


329

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)

답변:


383

Intent.ACTION_DIAL대신 사용할 수 있습니다 Intent.ACTION_CALL. 이 번호는 이미 입력 한 번호로 다이얼러를 표시하지만 실제로 전화를 걸지 여부를 결정할 수 있습니다. 권한이 ACTION_DIAL필요하지 않습니다 CALL_PHONE.


ACTION_DIAL은 권한이 필요하지 않습니다. 이것은 ACTION_CALL 의도와 비교하여 중요한 차이점입니다.)
maxwellnewage

237

이 데모는 당신에게 도움이 될 것입니다 ...

통화 버튼 클릭 :

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

매니페스트의 권한 :

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

1
"tel :"+1 대신 전화를 걸어 의도적 인 예외는 없었습니다. Tnx
Tina

넥서스 4에서는 작동하지 않습니다. 전화 번호를 표시하는 다이얼러가 열리지 만 사용자 상호 작용없이 통화를 시작하지는 않습니다. 어떤 sugestion?
MatheusJardimB

5
질문 과이 답변의 코드는 어떻게 다릅니 까? 문제를 어떻게 해결합니까?
Gavriel

이것은 나를 위해 스카이프를 엽니 다.
RJB

전화 걸기 런타임 권한도 추가하십시오
Raghu Krishnan R

180

더 우아한 옵션 :

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

5
이것은 이전 답변과 같은 매니페스트에 아무것도 추가하지 않고 작동합니다
Pavlos

4
런타임 권한이 필요하지 않습니다. +1
kike

82

의도가없는 ACTION_DIAL 작업을 사용하면 권한이 필요하지 않습니다. ACTION_CALL 권한이 필요한 이유는 사용자의 조치없이 전화를 걸기 위해서입니다.

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

2
허가를 요청할 필요가없는 경우에 더 좋습니다.
zackygaurav

1
코드의 두 번째 줄에 누락 된 세미콜론이 있습니다. 완벽한 답변!
ahmed_khan_89

73

모든 것이 괜찮습니다.

방금 매니페스트 파일에서 응용 프로그램 태그 앞에 통화 권한 태그를 배치했습니다.

이제 모든 것이 잘 작동합니다.


2
권한이 필요하지 않고 사용자가 실제로 전화를 걸 수없는 기회와 거의 똑같이 달성하는 방법에 대한 아래 답변을 참조하십시오.
Ridcully

3
또한 전화가없는 장치에주의하십시오. stackoverflow.com/a/9300036/693752
Snicolas


31

중요 사항:

사용하는 경우 권한을 Intent.ACTION_CALL추가해야합니다 CALL_PHONE.

SIM 카드가 없거나 GSM이없는 태블릿의 경우 Google Play에 앱이 표시되지 않도록하려는 경우에만 가능합니다.

당신의 활동에서 :

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

이에 대한 권한이 필요하지 않습니다.


24

추가 권한이 필요없는 간단한 oneliner 만 있으면됩니다.

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

18

이 전체 코드를 사용하십시오

          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
Intent.ACTION_DIAL을 Intent.Anction_CALL로 변경해야했지만이 기술은 저에게 효과적이었습니다.
Naeem A. Malik

12

매니페스트의 권한 요청

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

3
앱이 자체 호출하는 것이 아니라 전용 앱 (권한이있는 앱)에 요청하기 때문에 권한이 필요하지 않다고 생각합니다.
Mostrapotski

9

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

8

권한 :

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

의지:

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

6

이것을 사용할 수도 있습니다 :

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

5

의도를 사용하여 통화 활동을하려면 적절한 권한을 요청해야합니다.

이를 위해 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();
}

4

다이얼러에서 전화 걸기 (권한이 필요 없음) :

   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>

3

이를 피하기 위해 권한을 입력하기 위해 GUI를 사용할 수 있습니다. Eclipse는 권한 태그를 삽입 할 위치를 관리하므로 더 자주 올바르지 않습니다.


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

Android에서 특정 기능을 사용하려면 Manifest 파일에 권한을 추가해야합니다.

  1. 프로젝트 AndroidManifest.xml로 이동
  2. 권한 탭을 클릭하십시오
  3. 추가 클릭
  4. 사용 권한 선택
  5. 아래 스냅 샷을 참조하십시오여기에 이미지 설명을 입력하십시오

6. 매니페스트 파일을 저장 한 다음 프로젝트를 실행하십시오. 이제 프로젝트가 예상대로 실행됩니다.


1
어떤 IDE를 사용하고 있습니까?
SHA2NK

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

^ 답변은 예외 출력 " 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")));
                }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.