2011-03-08 3 views
20

를 클릭하여 전화 나 텍스트 상자에 주어진 번호로 전화를 걸 싶지만 오류를 받고 있어요 : 안드로이드 앱은 버튼의 숫자가

The application 'xyz'(process com.android) has stopped unexpectedly

다음

내 코드입니다. 어디가 잘못 됐어?

EditText txtPhn; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button callButton = (Button)findViewById(R.id.btnCall); 
    txtPhn = (EditText)findViewById(R.id.txtPhnNumber); 
    callButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      try { 
        Intent callIntent = new Intent(Intent.ACTION_CALL); 
        callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString())); 
        startActivity(callIntent); 
       } catch (ActivityNotFoundException activityException) { 
        Log.e("Calling a Phone Number", "Call failed", activityException); 
       } 
     } 
    }); 
} 

편집을 할 로그 캣

03-09 11:23:25.874: ERROR/AndroidRuntime(370): FATAL EXCEPTION: main 
03-09 11:23:25.874: ERROR/AndroidRuntime(370): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{40738d70 370:org.krish.android/10034} (pid=370, uid=10034) requires android.permission.CALL_PHONE 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Parcel.readException(Parcel.java:1322) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Parcel.readException(Parcel.java:1276) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.Activity.startActivityForResult(Activity.java:2827) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.Activity.startActivity(Activity.java:2933) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at org.krish.android.caller$1.onClick(caller.java:29) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.view.View.performClick(View.java:2485) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.view.View$PerformClick.run(View.java:9080) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Handler.handleCallback(Handler.java:587) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Looper.loop(Looper.java:123) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at dalvik.system.NativeStart.main(Native Method)`enter code here` 
+0

매니페스트 파일에서 권한을 선언 했습니까? –

+0

내 매니페스트 파일에 해당 태그를 추가했습니다 ...그 다음 동일한 문제 – FosterZ

+0

당신이 테스트하고 어떤 출력 장치에 로그 출력을 게시 – ingsaurabh

답변

18

당신이 외부 AndroidManifest.xml 파일 (<application ... /> 태그의 정확한 수준에서 <uses-permission ... /> 태그를 추가했는지 확인하십시오 당신의 AndroidManifest.xml에 권한

uses-permission android:name="android.permission.CALL_PHONE" 

이 있는지 확인 <manifest ... /> 태그 내) :

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.dbm.pkg" 
    android:versionCode="1" 
    android:versionName="1.0"> 

    <!-- NOTE! Your uses-permission must be outside the "application" tag 
       but within the "manifest" tag. --> 

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

    <application 
     android:icon="@drawable/icon" 
     android:label="@string/app_name"> 

     <!-- Insert your other stuff here --> 

    </application> 

    <uses-sdk android:minSdkVersion="9" /> 
</manifest> 
2

는 다음과 같은 방법을 시도 할 수도 :

Intent callIntent = new Intent(Intent.ACTION_CALL); 
callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString())); 
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(callIntent); 

, 즉 callIntent.setFlags(...) 함수 호출을 추가하십시오.

0

를 추가해보십시오 트림() :

callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString().trim())); 
+0

@ Peter-not worked .. – FosterZ

10

호출하는 두 가지 의도가있다/호출 시작 : ACTION_CALL 및 ACTION_DIAL을.

ACTION_DIAL은 번호가 채워진 다이얼러 만 열지 만 사용자가 실제로 전화를 걸거나 거부 할 수 있습니다. ACTION_CALL은 즉시 번호로 전화를 걸어 여분의 권한이 필요합니다. 그래서

당신이

+0

참으로 나는이 허가를'use-permission android : name = "android.permission.CALL_PHONE"'이미 ... – FosterZ

+0

추가했다. 그러면 디버깅을 정말로 시작해야한다. Eclipse에서 ddms 뷰를 살펴보면 실제 스택 추적을 볼 수있다. 그것은 어딘가에 NullPointerException이 될 수도 있습니다 ... –

+0

NetBeans에서 똑같은 것을 붙여 넣은 새로운 것을 눈치 챘습니다. 그리고 완벽하게 실행되었습니다 ... 여전히 이클립스와 함께 문제가 발생하지 않았습니다 .. – FosterZ

0

실제 장치에서 테스트해야 할 수도 있습니다. 나는 같은 문제에 직면했고 실제 장치에서 작동했습니다. 전화와 GPS 둘 다 때때로 AVD에서 예상대로 작동하지 않습니다.

2

API 24

Intent intent = new Intent(Intent.ACTION_CALL); 
    intent.setData(Uri.parse("tel:+94720999666")); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     // ActivityCompat#requestPermissions 
     // here to request the missing permissions, and then overriding 
     // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     //           int[] grantResults) 
     // to handle the case where the user grants the permission. See the documentation 
     // for ActivityCompat#requestPermissions for more details. 
     return; 
    } 
    startActivity(intent); 

또한

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

문제는 당신이 사용자로부터 권한을 요청하지 않은 것입니다 추가 할 수 있습니다. 기기가 Android 6.0 (API 수준 23)을 실행 중이고 앱의 targetSdkVersion이 23 이상인 경우 통화 권한이 위험한 권한으로 간주됩니다. 따라서 먼저 올바른 권한을 얻어야합니다. 먼저 AndroidManifest.xml 파일에

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.android.app.myapp" > 
     <uses-permission android:name="android.permission.CALL_PHONE" /> 
     ... 
    </manifest> 

을 추가하십시오.

그런 다음 버튼을 클릭하여 호출되는 메소드가 있습니다.

public void onCall(View view) { 
      Intent callIntent = new Intent(Intent.ACTION_CALL); //use ACTION_CALL class 
      callIntent.setData(Uri.parse("tel:0800000000")); //this is the phone number calling 
      //check permission 
      //If the device is running Android 6.0 (API level 23) and the app's targetSdkVersion is 23 or higher, 
      //the system asks the user to grant approval. 
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
       //request permission from user if the app hasn't got the required permission 
       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.CALL_PHONE}, //request specific permission from user 
         10); 
       return; 
      }else {  //have got permission 
       try{ 
        startActivity(callIntent); //call activity and make phone call 
       } 
       catch (android.content.ActivityNotFoundException ex){ 
        Toast.makeText(getApplicationContext(),"yourActivity is not founded",Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
관련 문제