1

我正在開發一個應用程序,用於處理用戶消息,電話簿查詢和呼叫狀態。java.lang.RuntimeException:無法實例化接收器

應用程序運行完美,因爲當我得到一個電話我的應用程序崩潰。

這是我的一些用戶報告的錯誤。

> java.lang.RuntimeException: Unable to instantiate receiver 
> me.radhakrishna.buddyreader.CustomPhoneStateListener: 
> java.lang.InstantiationException: can't instantiate class 
> me.radhakrishna.buddyreader.CustomPhoneStateListener; no empty 
> constructor at 
> android.app.ActivityThread.handleReceiver(ActivityThread.java:2105) at 
> android.app.ActivityThread.access$1500(ActivityThread.java:123) at 
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1202) 
> at android.os.Handler.dispatchMessage(Handler.java:99) at 
> android.os.Looper.loop(Looper.java:137) at 
> android.app.ActivityThread.main(ActivityThread.java:4450) at 
> java.lang.reflect.Method.invokeNative(Native Method) at 
> java.lang.reflect.Method.invoke(Method.java:511) at 
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) at 
> dalvik.system.NativeStart.main(Native Method) Caused by: 
> java.lang.InstantiationException: can't instantiate class 
> me.radhakrishna.buddyreader.CustomPhoneStateListener; no empty 
> constructor at java.lang.Class.newInstanceImpl(Native Method) at 
> java.lang.Class.newInstance(Class.java:1319) at 
> android.app.ActivityThread.handleReceiver(ActivityThread.java:2100) 
> ... 10 more 

這裏是我的

CustomPhoneStateListener.java 

文件

package me.radhakrishna.buddyreader; 

import android.content.Context; 
import android.database.Cursor; 
import android.net.Uri; 
import android.provider.ContactsContract.PhoneLookup; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 

public class CustomPhoneStateListener extends PhoneStateListener { 
    final MainActivity main = new MainActivity(); 
    //private static final String TAG = "PhoneStateChanged"; 
    Context context; //Context to make Toast if required 
    public CustomPhoneStateListener(Context context) { 
     super(); 
     this.context = context; 
    } 

    public void phonePlayer(String incomingNumber){ 
     Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(incomingNumber)); 
     Cursor cursor= context.getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},null,null,null); 

     if (cursor.getCount()>0){ 
      cursor.moveToFirst(); 
      String contactName = cursor.getString(0); 
      cursor.close(); 

      String enteredText = "Incoming call from "+contactName; 
      String words = enteredText.toString(); 
      main.speakWords(words); 
     }else{ 
      String enteredText = "Incoming call from "+incomingNumber; 
      String words = enteredText.toString(); 
      main.speakWords(words); 
     } 
    } 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 

     switch (state) { 
     case TelephonyManager.CALL_STATE_IDLE: 
      //when Idle i.e no call 
      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
      //when Off hook i.e in call 
      //Make intent and start your service here 
      break; 
     case TelephonyManager.CALL_STATE_RINGING: 
      //when Ringing 
      main.stopReading(); 
      phonePlayer(incomingNumber); 
      break; 
     default: 
      break; 
     } 
    } 
} 

這裏是我的TextMessageReceiver.java

TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
telephonyManager.listen(new CustomPhoneStateListener(context), PhoneStateListener.LISTEN_CALL_STATE); 

我的清單文件

<receiver android:name=".CustomPhoneStateListener"> 
    <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
</receiver> 

任何人都可以幫我嗎?提前致謝。

+0

你是否在清單文件中加入了這個? – 2013-03-09 06:51:34

+0

雅我在上面看到了我的清單 – 2013-03-09 07:24:50

回答

1

PhoneStateListener不是接收者,所以你不能把它放入清單。

如果手機狀態發生變化,Android將發送android.intent.action.PHONE_STATE廣播。

所以你應該:

public class CustomPhoneStateReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
     telephonyManager.listen(new CustomPhoneStateListener(context), PhoneStateListener.LISTEN_CALL_STATE); 
    } 
} 

,並將該接收到您的清單文件。

<receiver android:name=".CustomPhoneStateReceiver"> 
    <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
</receiver> 
+0

你能詳細說明嗎?我沒有得到你所說的話。 – 2013-03-09 08:17:22

+0

您將一個CustomPhoneStateListener放入清單中,它不是接收者。 – StarPinkER 2013-03-09 08:30:51

+0

這裏CustomPhoneStateListener.java擴展PhoneStateListener如何擴展BroadcastReceiver?我可以爲此另取一個java文件嗎? – 2013-03-10 06:54:41

相關問題