2011-03-08 44 views
20

我想打電話給在文本框中賦予了許多,但我得到的錯誤:Android應用程序調用上的按鈕數單擊

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

EDITED logcat的

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

您是否聲明清單文件中的權限? – 2011-03-08 10:07:13

+0

我已將該標籤添加到我的清單文件中...那麼同樣的問題 – FosterZ 2011-03-08 10:10:29

+0

你正在測試哪個設備併發布日誌輸出 – ingsaurabh 2011-03-08 10:25:18

回答

18

確保您已經添加了<uses-permission ... />標籤在AndroidManifest.xml文件(<application ... />標籤的正確的水平但在<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-沒有工作.. – FosterZ 2011-03-08 12:28:32

10

有兩個意圖調用/開始打電話:ACTION_CALL和ACTION_DIAL。

ACTION_DIAL只會打開撥號器號碼,但允許用戶實際呼叫或拒絕呼叫。 ACTION_CALL會立即撥打該號碼並需要額外的權限。

所以請確保您有權限

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

在AndroidManifest.xml中

+0

是的,我已經添加了這個權限'使用權限android:name =「android.permission.CALL_PHONE」'已經... – FosterZ 2011-03-08 13:38:40

+0

然後你真的需要開始調試。看看Eclipse中的ddms視圖 - 你應該看到實際的堆棧跟蹤。它可能是一個NullPointerException異常... – 2011-03-08 14:16:25

+0

我已經注意到一件新事物,我複製粘貼在NetBeans中的相同的東西,它運行完美...仍然沒有得到與Eclipse的問題.. – FosterZ 2011-03-08 18:40:07

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或更高,則呼叫權限將被視爲危險權限。因此,您必須先獲得正確的許可。 首先,將

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

添加到您的AndroidManifest.xml文件中。

然後,我點擊一個按鈕來調用一個方法。

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(); 
       } 
      } 
     } 
相關問題