2013-03-25 46 views
3

我的模擬器:安卓:拋出:IllegalArgumentException: 「Component類X不存在」 在API 17(不崩潰API 8)

emulators

當我推出的平板模擬器我得到:

FATAL EXCEPTION: main 
java.lang.IllegalArgumentException: Component class TriggerMonitoringBootReceiver does not exist in di.k23b.hw3 
    at android.os.Parcel.readException(Parcel.java:1429) 
    at android.os.Parcel.readException(Parcel.java:1379) 
    at android.content.pm.IPackageManager$Stub$Proxy.setComponentEnabledSetting(IPackageManager.java:2561) 
    at android.app.ApplicationPackageManager.setComponentEnabledSetting(ApplicationPackageManager.java:1250) 
    at di.k23b.hw3.receivers.TriggerMonitoringBootReceiver.enable(TriggerMonitoringBootReceiver.java:81) 
    at di.k23b.hw3.receivers.TriggerMonitoringBootReceiver.enable(TriggerMonitoringBootReceiver.java:86) 
    at di.k23b.hw3.activities.SettingsActivity.onSharedPreferenceChanged(SettingsActivity.java:192) 
    at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:475) 
    at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:385) 
    at android.preference.Preference.tryCommit(Preference.java:1349) 
    at android.preference.Preference.persistBoolean(Preference.java:1615) 
    at android.preference.TwoStatePreference.setChecked(TwoStatePreference.java:83) 
    at android.preference.TwoStatePreference.onClick(TwoStatePreference.java:69) 
    at android.preference.Preference.performClick(Preference.java:949) 
    at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:215) 
    at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
    at android.widget.AbsListView.performItemClick(AbsListView.java:1100) 
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749) 
    at android.widget.AbsListView$1.run(AbsListView.java:3423) 
    at android.os.Handler.handleCallback(Handler.java:725) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5041) 
    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:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    at dalvik.system.NativeStart.main(Native Method) 

當我啓動升級Froyo模擬器所有的罰款(編輯:不,沒有 - 接收器未啓用,但仍然沒有崩潰)。
這是一個已知的問題或什麼?

清單:

private static void enable(Context context, boolean enable, String className) { 
    PackageManager pacman = context.getPackageManager(); 
    final ComponentName componentName = new ComponentName(context, className); 
    final int state = (enable) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED 
      : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 
    pacman.setComponentEnabledSetting(componentName, state, // line 81 
      PackageManager.DONT_KILL_APP); 
} 

public static void enable(Context baseContext, boolean enable) { 
    enable(baseContext, enable,     // line 86 
      TriggerMonitoringBootReceiver.class.getSimpleName()); 
} 

而且在SettingsActivity:

@Override 
public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
    if (MASTER_ENABLE.equals(key)) { 
     TriggerMonitoringBootReceiver.enable(getBaseContext(),  // line 192 
       sp.getBoolean(key, false)); 
     Toast.makeText(getApplicationContext(), 
       "CB: " + sp.getBoolean(key, false), Toast.LENGTH_SHORT) 
       .show(); 
    } 
} 



從接收機(!WIP)

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="di.k23b.hw3" 
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> 
    <application android:allowBackup="true" android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" android:theme="@style/AppTheme" > 
     <activity 
      android:name="di.k23b.hw3.activities.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> 
     <activity 
      android:name="di.k23b.hw3.activities.SettingsActivity" 
      android:label="@string/title_activity_settings" > 
     </activity> 
     <receiver 
      android:name="di.k23b.hw3.receivers.TriggerMonitoringBootReceiver" 
      android:enabled="false" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
     <receiver 
      android:name="di.k23b.hw3.receivers.BatteryMonitoringReceiver" 
      android:enabled="false"/> 
    </application> 
</manifest> 

相關部分

編輯:現在都清楚,使用ComponentName(Context pkg, Class<?> cls) - 作爲在API的區別:
Calls to PackageManager.setComponentEnabledSetting will now throw an IllegalArgumentException if the given component class name does not exist in the application's manifest.

回答

1
TriggerMonitoringBootReceiver.class.getSimpleName(); 

和打包

PackageManager pacman = context.getPackageManager(); 

一起給

di.k23b.hw3.TriggerMonitoringBootReceiver 

因此,您缺少類名稱中的「/ receivers /」文件夾前綴

+0

我用'getBaseContext()'得到上下文 - 用'getApplicationContext()'嘗試也無濟於事 - 所以我現在的問題是:哪個'ComponentName()'[構造函數](http:// developer .android.com/reference/android/content/ComponentName.html#ComponentName%28android.content.Context,%20java.lang.String%29)我應該使用嗎?如果使用我_did_使用的構造函數,應該如何獲取上下文?爲什麼API 17崩潰而API 8不崩潰? – 2013-03-25 18:11:18

0

如果使用AndroidAnnotations,請改用覆蓋類名稱。

// CORRECT class definition. 
ComponentName receiver = new ComponentName(context, NotificationPublisher_.class); 

但是,

// THIS WILL GIVE YOU CRASH. 
ComponentName receiver = new ComponentName(context, NotificationPublisher.class); 
1

就在這個線程已經彙總的信息。

使用構造函數 ComponentName(Context pkg, Class<?> cls)

此外,組件名稱需要在清單中指定。請參閱this link中的JELLYBEAN。
Calls to PackageManager.setComponentEnabledSetting will now throw an IllegalArgumentException if the given component class name does not exist in the application's manifest.

+0

我是否需要爲Manifest中的組件提供完整的類路徑?我已經指定。清單中的尚未獲得IllegalArgumentException。 – Ishaan 2017-04-24 13:54:16

+0

@Ishaan「android:name =」應該是我相信的完整路徑。我提到了我的代碼,這就是我正在使用的。 – notsopopularguy 2017-04-24 13:56:33

+0

謝謝。讓我嘗試。 – Ishaan 2017-04-24 14:01:33

相關問題