2012-11-18 36 views
1

當有人打電話時,如果我拒絕或放棄呼叫,我的應用程序會向呼叫者發送自動回覆。但是當我拒絕呼叫時,AVD顯示一條消息 - 「不幸Autoreply2Caller停止」。請幫助。這裏是我的源代碼: 包bd.com.example.autoreply2caller;如何檢索來電的號碼並在拒絕來電時發送短信?

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.telephony.TelephonyManager; 
import android.telephony.gsm.SmsManager; 
import android.widget.Toast; 

public class ReplyToCaller extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // Toast.makeText(context, "SMS Received: " + intent.getAction(), 
     // Toast.LENGTH_LONG).show(); 

     if (intent.getAction() 
       .equals("android.provider.Telephony.SMS_RECEIVED")) { 
      // extract the SMS 
      Bundle bundle = intent.getExtras(); 
      SmsMessage[] chunks = null; 
      String number = ""; 
      String text = ""; 

      if (bundle != null) { 
       Object[] pdus = (Object[]) bundle.get("pdus"); 
       chunks = new SmsMessage[pdus.length]; 
       for (int i = 0; i < pdus.length; i++) { 
        chunks[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
        text += chunks[i].getMessageBody(); 
        number = chunks[i].getOriginatingAddress(); 
       } 
      } 
      Toast.makeText(context, 
        "SMS Received: from: " + number + " Message Body: " + text, 
        Toast.LENGTH_LONG).show(); 
      // send an automatic reply 
      SmsManager smsManager = SmsManager.getDefault(); 
      smsManager.sendTextMessage(number, null, 
        "I am busy right now. I'll call you later.", null, null); 

     } 

     // reply to the caller 
     String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 

     if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
      // Phone is ringing 

     } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
      // Call received 

     } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
      // Call Dropped or rejected 
      String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 


      // send an automatic reply 
      SmsManager smsManager = SmsManager.getDefault(); 
      smsManager.sendTextMessage(number, null, 
        "I am busy right now. I'll call you later.", null, null); 

     } 

    } 
} 

而且清單

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

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
    <uses-permission android:name="android.permission.SEND_SMS"/> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <uses-permission android:name="android.permission.CALL_PHONE"/> 
    <uses-permission android:name="android.permission.CALL_PRIVILEGED"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver android:name="ReplyToCaller"> 
      <intent-filter> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
       <action android:name="android.intent.action.PHONE_STATE"/> 
       <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 


11-18 20:05:30.543: D/AndroidRuntime(3311): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<< 
11-18 20:05:30.543: D/AndroidRuntime(3311): CheckJNI is ON 
11-18 20:05:30.613: D/dalvikvm(3311): Trying to load lib libjavacore.so 0x0 
11-18 20:05:30.623: D/dalvikvm(3311): Added shared lib libjavacore.so 0x0 
11-18 20:05:30.709: D/dalvikvm(3311): Trying to load lib libnativehelper.so 0x0 
11-18 20:05:30.709: D/dalvikvm(3311): Added shared lib libnativehelper.so 0x0 
11-18 20:05:31.899: D/AndroidRuntime(3311): Calling main entry com.android.commands.am.Am 
11-18 20:05:31.963: I/ActivityManager(1022): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=bd.com.example.autoreply2caller/.MainActivity u=0} from pid 3311 
11-18 20:05:31.963: W/WindowManager(1022): Failure taking screenshot for (164x246) to layer 21030 
11-18 20:05:32.093: D/AndroidRuntime(3311): Shutting down VM 
11-18 20:05:32.093: D/dalvikvm(798): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-18 20:05:32.103: I/ActivityManager(1022): Start proc bd.com.example.autoreply2caller for activity bd.com.example.autoreply2caller/.MainActivity: pid=3321 uid=10053 gids={1028} 
11-18 20:05:32.193: D/dalvikvm(3321): Not late-enabling CheckJNI (already on) 
11-18 20:05:32.247: I/Choreographer(1022): Skipped 40 frames! The application may be doing too much work on its main thread. 
11-18 20:05:32.293: D/dalvikvm(3321): Debugger has detached; object registry had 1 entries 
11-18 20:05:32.303: D/dalvikvm(3311): GC_CONCURRENT freed 101K, 77% free 479K/2048K, paused 4ms+36ms, total 163ms 
11-18 20:05:32.303: D/jdwp(3311): Got wake-up signal, bailing out of select 
11-18 20:05:32.303: D/dalvikvm(3311): Debugger has detached; object registry had 1 entries 
11-18 20:05:32.393: D/dalvikvm(798): GC_EXPLICIT freed 37K, 6% free 5935K/6275K, paused 4ms+6ms, total 272ms 
11-18 20:05:32.393: D/dalvikvm(798): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-18 20:05:32.413: E/Trace(3321): error opening trace file: No such file or directory (2) 
11-18 20:05:32.533: D/dalvikvm(798): GC_EXPLICIT freed <1K, 6% free 5935K/6275K, paused 45ms+5ms, total 139ms 
11-18 20:05:32.533: D/dalvikvm(798): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-18 20:05:32.683: D/dalvikvm(1022): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-18 20:05:32.693: D/dalvikvm(798): GC_EXPLICIT freed <1K, 6% free 5935K/6275K, paused 67ms+3ms, total 157ms 
11-18 20:05:32.903: I/Choreographer(1022): Skipped 32 frames! The application may be doing too much work on its main thread. 
11-18 20:05:33.423: D/dalvikvm(1022): GC_EXPLICIT freed 484K, 20% free 9202K/11399K, paused 15ms+25ms, total 738ms 
11-18 20:05:33.523: I/Choreographer(1022): Skipped 33 frames! The application may be doing too much work on its main thread. 
11-18 20:05:33.793: D/gralloc_goldfish(3321): Emulator without GPU emulation detected. 
11-18 20:05:33.903: I/Choreographer(1022): Skipped 31 frames! The application may be doing too much work on its main thread. 
11-18 20:05:33.903: I/ActivityManager(1022): Displayed bd.com.example.autoreply2caller/.MainActivity: +1s854ms 
11-18 20:05:33.983: I/Choreographer(1022): Skipped 50 frames! The application may be doing too much work on its main thread. 
11-18 20:05:35.492: D/CallNotifier(1119): RINGING... (new) 
11-18 20:05:35.492: D/CallNotifier(1119): onNewRingingConnection(): state = RINGING, conn = { incoming: true state: INCOMING post dial state: NOT_STARTED } 
11-18 20:05:35.502: D/CallNotifier(1119): SignalInfoTonePlayer.run(toneId = 98)... 
11-18 20:05:35.552: D/PhoneNumberUtils(1119): System property doesn't provide any emergency numbers. Use embedded logic for determining ones. 
11-18 20:05:35.602: D/PhoneStatusBar(1084): disable: < expand icons ALERTS* ticker system_info back home recent clock > 
11-18 20:05:35.642: D/AccelerometerListener(1119): enable(false) 
11-18 20:05:35.862: D/CallNotifier(1119): showIncomingCall()... phone state = RINGING 
11-18 20:05:35.962: D/dalvikvm(1191): GC_CONCURRENT freed 334K, 9% free 6894K/7495K, paused 16ms+6ms, total 253ms 
11-18 20:05:36.063: D/PhoneStatusBar(1084): addNotification score=20 
11-18 20:05:36.342: D/PhoneStatusBar(1084): Notification has fullScreenIntent; sending fullScreenIntent 
11-18 20:05:36.342: I/ActivityManager(1022): START {act=android.intent.action.MAIN flg=0x10840000 cmp=com.android.phone/.InCallScreen u=0} from pid -1 
11-18 20:05:36.392: I/Choreographer(1022): Skipped 32 frames! The application may be doing too much work on its main thread. 
11-18 20:05:36.392: W/WindowManager(1022): Failure taking screenshot for (164x246) to layer 21030 
11-18 20:05:36.412: E/WVMExtractor(800): Failed to open libwvm.so 
11-18 20:05:36.543: I/Choreographer(1084): Skipped 156 frames! The application may be doing too much work on its main thread. 
11-18 20:05:36.692: D/Ringtone(1119): Successfully created local player 
11-18 20:05:36.692: I/AudioService(1022): AudioFocus requestAudioFocus() from AudioFocus_For_Phone_Ring_And_Calls 
11-18 20:05:36.722: D/AudioHardwareInterface(800): setMode(RINGTONE) 
11-18 20:05:36.772: I/Choreographer(1084): Skipped 56 frames! The application may be doing too much work on its main thread. 
11-18 20:05:36.812: D/AudioSink(800): bufferCount (4) is too small and increased to 12 
11-18 20:05:36.822: I/Choreographer(1084): Skipped 32 frames! The application may be doing too much work on its main thread. 
11-18 20:05:36.912: D/InCallScreen(1119): onNewIntent: intent = Intent { act=android.intent.action.MAIN flg=0x10c40000 cmp=com.android.phone/.InCallScreen }, phone state = RINGING 
11-18 20:05:36.912: D/PhoneStatusBar(1084): disable: < EXPAND* icons ALERTS ticker system_info back home recent clock > 
11-18 20:05:37.063: D/InCallTouchUi(1119): showIncomingCallWidget(). widget visibility: 8 
11-18 20:05:37.105: I/Choreographer(1022): Skipped 82 frames! The application may be doing too much work on its main thread. 
11-18 20:05:37.105: I/Choreographer(1084): Skipped 83 frames! The application may be doing too much work on its main thread. 
11-18 20:05:37.122: D/PhoneStatusBar(1084): disable: < EXPAND icons ALERTS ticker system_info BACK* HOME* RECENT* clock > 
11-18 20:05:37.162: I/Choreographer(1119): Skipped 144 frames! The application may be doing too much work on its main thread. 
11-18 20:05:37.326: I/Choreographer(1084): Skipped 129 frames! The application may be doing too much work on its main thread. 
11-18 20:05:37.692: I/Choreographer(1119): Skipped 237 frames! The application may be doing too much work on its main thread. 
11-18 20:05:37.732: I/Choreographer(1022): Skipped 64 frames! The application may be doing too much work on its main thread. 
11-18 20:05:37.862: I/Choreographer(1022): Skipped 65 frames! The application may be doing too much work on its main thread. 
11-18 20:05:38.732: D/InCallTouchUi(1119): showIncomingCallWidget(). widget visibility: 0 
11-18 20:05:38.742: I/Choreographer(1119): Skipped 725 frames! The application may be doing too much work on its main thread. 
11-18 20:05:38.912: I/Choreographer(1022): Skipped 80 frames! The application may be doing too much work on its main thread. 
11-18 20:05:39.142: D/dalvikvm(1310): WAIT_FOR_CONCURRENT_GC blocked 0ms 
11-18 20:05:39.172: I/Choreographer(1119): Skipped 249 frames! The application may be doing too much work on its main thread. 
11-18 20:05:39.462: D/dalvikvm(1310): GC_EXPLICIT freed 296K, 12% free 8404K/9479K, paused 4ms+54ms, total 325ms 
11-18 20:05:39.692: I/Choreographer(1119): Skipped 317 frames! The application may be doing too much work on its main thread. 
11-18 20:05:39.842: I/Choreographer(1119): Skipped 100 frames! The application may be doing too much work on its main thread. 
11-18 20:05:40.062: I/Choreographer(1119): Skipped 143 frames! The application may be doing too much work on its main thread. 
11-18 20:05:40.372: I/Choreographer(1119): Skipped 205 frames! The application may be doing too much work on its main thread. 
11-18 20:05:40.672: I/Choreographer(1119): Skipped 193 frames! The application may be doing too much work on its main thread. 
11-18 20:05:40.902: I/Choreographer(1119): Skipped 153 frames! The application may be doing too much work on its main thread. 
11-18 20:05:41.192: I/Choreographer(1119): Skipped 187 frames! The application may be doing too much work on its main thread. 
11-18 20:05:41.304: D/dalvikvm(1119): GC_CONCURRENT freed 388K, 9% free 7589K/8327K, paused 47ms+11ms, total 189ms 
11-18 20:05:41.432: I/Choreographer(1119): Skipped 156 frames! The application may be doing too much work on its main thread. 
11-18 20:05:41.672: I/Choreographer(1119): Skipped 157 frames! The application may be doing too much work on its main thread. 
11-18 20:05:41.972: I/Choreographer(1119): Skipped 191 frames! The application may be doing too much work on its main thread. 
11-18 20:05:42.292: D/PhoneUtils(1119): hangup(): hanging up ringing call 
11-18 20:05:42.292: D/PhoneUtils(1119): hangupRingingCall(): regular incoming call: hangup() 
11-18 20:05:42.292: D/PhoneUtils(1119): - hangup(Call): regular hangup()... 
11-18 20:05:42.332: I/Choreographer(1119): Skipped 235 frames! The application may be doing too much work on its main thread. 
11-18 20:05:42.622: I/Choreographer(1119): Skipped 225 frames! The application may be doing too much work on its main thread. 
11-18 20:05:42.732: I/Choreographer(1119): Skipped 70 frames! The application may be doing too much work on its main thread. 
11-18 20:05:42.852: I/Choreographer(1119): Skipped 83 frames! The application may be doing too much work on its main thread. 
11-18 20:05:43.122: D/PhoneStatusBar(1084): disable: < EXPAND icons alerts* ticker system_info BACK HOME RECENT clock > 
11-18 20:05:43.174: D/AndroidRuntime(3321): Shutting down VM 
11-18 20:05:43.174: W/dalvikvm(3321): threadid=1: thread exiting with uncaught exception (group=0xb3de7288) 
11-18 20:05:43.192: E/AndroidRuntime(3321): FATAL EXCEPTION: main 
11-18 20:05:43.192: E/AndroidRuntime(3321): java.lang.RuntimeException: Unable to start receiver bd.com.example.autoreply2caller.ReplyToCaller: java.lang.IllegalArgumentException: Invalid destinationAddress 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2236) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.app.ActivityThread.access$1500(ActivityThread.java:130) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.os.Looper.loop(Looper.java:137) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at dalvik.system.NativeStart.main(Native Method) 
11-18 20:05:43.192: E/AndroidRuntime(3321): Caused by: java.lang.IllegalArgumentException: Invalid destinationAddress 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.telephony.SmsManager.sendTextMessage(SmsManager.java:77) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.telephony.gsm.SmsManager.sendTextMessage(SmsManager.java:79) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at bd.com.example.autoreply2caller.ReplyToCaller.onReceive(ReplyToCaller.java:74) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2229) 
11-18 20:05:43.192: E/AndroidRuntime(3321):  ... 10 more 
11-18 20:05:43.202: D/AccelerometerListener(1119): enable(false) 
11-18 20:05:43.252: D/PhoneStatusBar(1084): disable: < expand* icons alerts ticker system_info BACK HOME RECENT clock > 
11-18 20:05:43.282: I/Choreographer(1119): Skipped 273 frames! The application may be doing too much work on its main thread. 
11-18 20:05:43.613: I/Choreographer(1022): Skipped 90 frames! The application may be doing too much work on its main thread. 
11-18 20:05:43.922: I/Choreographer(1022): Skipped 33 frames! The application may be doing too much work on its main thread. 
11-18 20:05:43.962: D/InCallTouchUi(1119): hideIncomingCallWidget() 
11-18 20:05:43.972: D/PhoneStatusBar(1084): disable: < expand icons alerts ticker system_info back* home* recent* clock > 
11-18 20:05:43.972: I/Choreographer(1119): Skipped 441 frames! The application may be doing too much work on its main thread. 
11-18 20:05:44.202: I/Choreographer(1022): Skipped 34 frames! The application may be doing too much work on its main thread. 
11-18 20:05:44.542: D/CallNotifier(1119): onDisconnect: cause = INCOMING_REJECTED, incoming = true, date = 1353247535489 
11-18 20:05:44.542: D/CallNotifier(1119): SignalInfoTonePlayer.run(toneId = 98)... 
11-18 20:05:44.602: D/AudioHardwareInterface(800): setMode(NORMAL) 
11-18 20:05:44.642: I/AudioService(1022): AudioFocus abandonAudioFocus() from AudioFocus_For_Phone_Ring_And_Calls 
11-18 20:05:44.692: I/PowerManagerService(1022): clearUserActivity for 10000ms from now 
11-18 20:05:44.702: D/PhoneNumberUtils(1119): System property doesn't provide any emergency numbers. Use embedded logic for determining ones. 
11-18 20:05:44.713: I/ActivityManager(1022): moveTaskToBack: 6 
11-18 20:05:45.002: W/WindowManager(1022): Failure taking screenshot for (164x246) to layer 21035 
11-18 20:05:45.092: I/Choreographer(1119): Skipped 723 frames! The application may be doing too much work on its main thread. 
11-18 20:05:45.182: I/Choreographer(1022): Skipped 98 frames! The application may be doing too much work on its main thread. 
11-18 20:05:45.443: I/Choreographer(1119): Skipped 228 frames! The application may be doing too much work on its main thread. 
11-18 20:05:45.573: I/Choreographer(1119): Skipped 71 frames! The application may be doing too much work on its main thread. 
11-18 20:05:45.747: D/InCallTouchUi(1119): - triggerPing: InCallScreen no longer in foreground; ignoring... 
11-18 20:05:46.454: W/ActivityManager(1022): Launch timeout has expired, giving up wake lock! 
11-18 20:05:50.532: I/Choreographer(1022): Skipped 33 frames! The application may be doing too much work on its main thread. 
11-18 20:05:55.350: W/ActivityManager(1022): Activity idle timeout for ActivityRecord{b471e7b0 bd.com.example.autoreply2caller/.MainActivity} 
+1

請發佈崩潰的logcat。那麼我們可以找出問題。 –

+0

我在清單代碼下面添加了logcat消息...請幫助 –

回答

0

收聽電話狀態使用PhoneStateListener見:this answer

嘗試smsMessages[n].getDisplayOriginatingAddress()

我總是從SMS拉動地址,像這樣:

Object messages[] = (Object[]) bundle.get("pdus"); 
smsMessages = new SmsMessage[messages.length]; 

for (int n = 0; n < messages.length; n++) 
{ 
    smsMessages[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
    JLog.v("Reciever: SMS :-\r\n ========== \r\n " 
      + smsMessages[n].getDisplayOriginatingAddress() + "\r\n " 
      + smsMessages[n].getServiceCenterAddress() + "\r\n " 
      + smsMessages[n].getDisplayMessageBody() 
      + "\r\n========"); 
} 

此外,您可能必須做的重新發送短信是確保號碼格式化!記錄這些東西真的有幫助!

傳出電話號碼需要看起來像4412345123456或任何其他有效的號碼。

PhoneNumberUtils爲您提供了格式化方法。

+0

我的問題是這裏:else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ // Call Dropped or rejected String number = intent.getStringExtra(Intent。 EXTRA_PHONE_NUMBER); //發送自動回覆 SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(number,null, 「我現在很忙,以後再打給你。」,null,null); } –

+0

用phonestatelistener鏈接更新http://stackoverflow.com/a/13154533/803225 –