2011-06-10 165 views
2

我已經編寫了通過廣播接收器監聽電話事件的PhoneStateListener。我接收關於TelephonyManager.CALL_STATE_IDLE代碼有什麼問題

06-10 13以下錯誤:50:48.360: VERBOSE/ERROR(4686):URI: 內容://com.android.contacts/phone_lookup/, 主叫用戶: com.emergency.alert, 調用包:com.emergency.alert

代碼是下面列出

public class MyPhoneStateListener extends PhoneStateListener { 
    public Context context; 
    //private static MediaPlayer mMediaPlayer; 
    private Uri alert; 
    private static Uri prev_ringtone; 
    public static final String PREFS_NAME = "ealertprefs"; 
    public static int phone_state; 
    public EmergencyAdapter dbHelper; 
    private String fetchName; 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     // TODO Auto-generated method stub  
     switch(state){ 
     case TelephonyManager.CALL_STATE_IDLE: 
      try { 
       if(call_from_elist(incomingNumber)) {     
        retrieve_phone();      
       } 
      } 
      catch(Exception e) { 
       Log.v("ERROR", e.getMessage()); 
      } 
      Log.v("CALL", "IDLE"); 
     break; 
     case TelephonyManager.CALL_STATE_OFFHOOK:         
       //retrieve_phone();         
     break; 
     case TelephonyManager.CALL_STATE_RINGING: 
      if(call_from_elist(incomingNumber)) { 
       set_uri(); 
       wake_up_phone(); 
       send_notification();      
      }  
     break; 
     } 
    } 
    private void retrieve_phone() { 
     AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);   
     am.setRingerMode(phone_state); 
     RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, prev_ringtone); 
    } 
    private boolean call_from_elist(String number) { 
     String[] projection = new String[] { 
       PhoneLookup._ID, 
       PhoneLookup.DISPLAY_NAME }; 

     // encode the phone number and build the filter URI 
     Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 

     // query time 
     Cursor c = context.getContentResolver().query(contactUri, projection, null, null, null); 

     // if the query returns 1 or more results 
     // return the first result 
     Log.v("ELIST", "LOG"); 
     if (c.moveToFirst()) { 
      Log.v("ELIST", "LOG2"); 
      String _id = c.getString(c 
        .getColumnIndex(ContactsContract.Contacts._ID)); 
      dbHelper = new EmergencyAdapter(context); 
      dbHelper.open(); 
      Log.v("CALLER", _id); 
      Cursor cursor = dbHelper.fetchEntry_call(Long.parseLong(_id)); 
      Log.v("CALLER", ""+cursor.getCount()); 
      if(cursor.getCount() > 0) {    
       fetchName = cursor.getString(1); 
       Log.v("CALLER", fetchName);   
       return true; 
      } 
      else {    
       return false; 
      }   
     } 
     return false; 
    } 
    private void wake_up_phone() { 
     AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
     phone_state = am.getRingerMode(); 
     Log.v("WAKEUP", Integer.toString(phone_state)); 
     RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, alert); 
     am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);   

    } 
    private void send_notification(){ 
     NotificationManager notifier = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);     
     int icon = R.drawable.icon; 
     Notification notification = new Notification(icon,"Simple Notification",System.currentTimeMillis());   
     Intent toLaunch = new Intent(context, main.class); 
     PendingIntent contentIntent = PendingIntent.getActivity(context, 0, toLaunch, 0);   
     notification.setLatestEventInfo(context, "Emergency Alert", "Emergency call received from "+fetchName, contentIntent);   
     notification.flags |= Notification.FLAG_AUTO_CANCEL;        
     notifier.notify(0x007, notification); 
    } 
    private void set_uri() { 
     SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0); 
     String ringtone = settings.getString("call_uri", ""); 
     if(ringtone.equals("")) { 
      this.alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     } 
     else { 
      this.alert = Uri.parse(ringtone); 
     }   
     prev_ringtone = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE); 
    } 
} 

此錯誤僅發生在TelephonyManager.CA LL_STATE_IDLE大小寫。請爲此問題提供任何解決方案。

堆棧跟蹤是

06-10 15:32:39.332: ERROR/AndroidRuntime(5559):致命 例外:主06-10 15:32:39.332: ERROR/AndroidRuntime(5559 ): java.lang.IllegalArgumentException異常: URI: 內容://com.android.contacts/phone_lookup/, 主叫用戶:com.emergency.alert, 調用包:com.emergency.alert 06-10 15 :32:39.332: ERROR/AndroidRuntime(5559):在 andr oid.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:144) 06-10 15:32:39.332: ERROR/AndroidRuntime(5559):在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114) 06 - 15:32:39.332: 錯誤/ AndroidRuntime(5559):在 在 android.content.ContentProviderProxy.query(ContentProviderNative.java:408) 06-10 15:32:39.332: ERROR/AndroidRuntime(5559):在 android.content.ContentResolver.query(ContentResolver.java:264) 06-10 15:32:39.332: ERROR/AndroidRuntime(5559):在 com.emergency.alert.MyPhoneStateListener.call_from_elist(MyPhoneStateListener.java:72) 06-10 15:32:39.332: ERROR/AndroidRuntime (5559):在 com.emergency.alert.MyPhoneStateListener.onCallStateChanged(MyPhoneStateListener.java:36) 06-10 15:32:39.332: ERROR/AndroidRuntime(5559):在 android.telephony.PhoneStateListener $ 2.handleMessage (PhoneStateListener.java:391) 06-10 15:32:39.332: ERROR/AndroidRuntime(5559):at android.os.Handler.dispatchMessage(Handler.java:99) 06-10 15:32:39.332 : 錯誤/ AndroidRuntime(5559):在 android.os.Looper.loop(Looper.java:143) 06-10 15:32:39.332: ERROR/AndroidRuntime(5559):在 android.app.ActivityThread.main(ActivityThread.java:4196) 06-10 15:32:39.332: 錯誤/ AndroidRuntime(5559):在 java.lang.reflect.Method.invokeNative(Native Method)06-10 15:32:39.332: 錯誤/ AndroidRuntime(5559):在 java.lang.reflect.Method.invoke(Method.java:507) 06-10 15:32:39。332: ERROR/AndroidRuntime(5559):在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839) 06-10 15:32:39.332: ERROR/AndroidRuntime(5559):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 06-10 15:32:39.332: ERROR/AndroidRuntime(5559):在 dalvik.system.NativeStart.main(母語 法)

+0

嘗試將實際的異常添加到Log.v()調用中,因爲它會轉儲引發LogCat的異常的完整詳細信息:Log.v(「TAG」,「它被捕獲的位置」,e);然後提供發生故障時轉儲的堆棧跟蹤的LogCat。 – 2011-06-10 09:09:26

+0

我已經發布堆棧跟蹤,請看看它,並讓我知道,如果你找出一些東西 – 2011-06-10 10:38:59

+0

你的URI格式不正確 – Blundell 2011-06-10 10:39:57

回答

4

我認爲你的問題是,當您收到CALL_STATE_IDLE,該incomingNumber變量沒有設置,因爲沒有活動或振鈴呼叫,因此沒有與當前電話狀態關聯的電話號碼。然後,您正在進行聯繫人查找,因爲您在查詢中沒有包含有效的電話號碼,因此查找失敗。

所以你試圖查找聯繫人,當你實際上沒有電話號碼搜索。

+0

感謝所以解決方案是在振鈴狀態設置本地靜態變量的電話號碼? – 2011-06-10 11:07:21

+0

不,因爲沒有與CALL_STATE_IDLE關聯的電話號碼,因此在沒有活動呼叫時查看當前活動的呼叫者沒有任何意義。 – 2011-06-10 12:15:12

0

啊我已經看到了這個錯誤之前,

你的URI格式不正確,你將它設置爲解故障鈴聲

prev_ringtone = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE); 

但是,默認的鈴聲尚未設置,因此您找回空白字符串/空或其他一些錯誤。

檢查這個問題,答案清晰:How to play ringtone/alarm sound in Android