web-dev-qa-db-ja.com

Androidアプリはボタンをクリックして番号を呼び出す

テキストボックスに指定された番号に電話をかけたいのですが、エラーが発生しています:

アプリケーション 'xyz'(プロセスcom.Android)が予期せず停止しました

以下は私のコードです。どこがおかしいの?

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`
22
FosterZ

<uses-permission ... />ファイルの正しいレベルにAndroidManifest.xmlタグを追加したことを確認してください(outside the <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> 
21
dbm

呼び出し/呼び出しの開始には、ACTION_CALLとACTION_DIALの2つの意図があります。

ACTION_DIALは、番号が入力されたダイヤラーのみを開きますが、ユーザーは実際に電話をかけたり拒否したりできます。 ACTION_CALLはすぐに番号を呼び出し、追加の許可が必要です。

だから、あなたが許可を持っていることを確認してください

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

あなたのAndroidManifest.xmlで

11

問題は、ユーザーに許可を要求しなかったことです。デバイスが実行されている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();
              }
          }
      }
4
Fred

次のアプローチを試してください。

_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(...)関数呼び出しを追加します。

3
dbm

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" />
2
A.G.THAMAYS

Trim()を追加してみてください:

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

おそらく実際のデバイスでテストする必要があります。私は同じ問題に直面し、実際のデバイスで機能しました。通話とGPSの両方が、AVDで期待どおりに機能しない場合があります。

0
samir