Ошибка исключения Android / Java ClassCastException

#java #android #classcastexception #device-admin

#java #Android #исключение classcastexception #устройство-администратор

Вопрос:

Я уже некоторое время зависаю в этой ошибке ClassCastException, кто-нибудь может помочь взглянуть? Я в основном пытаюсь следовать примеру администратора устройства Android, расширяя DeviceAdminReceiver. Я в основном удалил все и просто хочу протестировать функцию lockNow ().

Это мой код:


 package com.example.locknow;

public class LockNow extends DeviceAdminReceiver {

void showToast(Context context, CharSequence msg){
    Toast.makeText(context, "Lock_Now App: "   msg, Toast.LENGTH_SHORT).show();
}

@Override
public void onEnabled(Context context, Intent intent){
    showToast(context, "enabled");
}
@Override
public void onDisabled(Context context, Intent intent){
    showToast(context, "disabled");
}

public static class Controller extends Activity {

    static final int REQUEST_CODE_ENABLE_ADMIN = 1;

    DevicePolicyManager mDPM;
    ActivityManager mAM;
    ComponentName mLockNow;

    Button mEnableButton;
    Button mDisableButton;
    Button mForceLockButton;

    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
        mAM = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
        mLockNow = new ComponentName(Controller.this, LockNow.class);

        setContentView(R.layout.main);

        mEnableButton = (Button)findViewById(R.id.enable_button);
        mEnableButton.setOnClickListener(mEnableListener);
        mDisableButton = (Button)findViewById(R.id.disable_button);
        mDisableButton.setOnClickListener(mDisableListener);
        mForceLockButton = (Button)findViewById(R.id.force_lock_button);
        mForceLockButton.setOnClickListener(mForceLockListener);
    }

    void updateButtonStates(){
        boolean active = mDPM.isAdminActive(mLockNow);
        if (active) {
            mEnableButton.setEnabled(false);
            mDisableButton.setEnabled(true);
            mForceLockButton.setEnabled(true);
        } else {
            mEnableButton.setEnabled(true);
            mDisableButton.setEnabled(false);
            mForceLockButton.setEnabled(false);
        }
    }

    private OnClickListener mEnableListener = new OnClickListener(){
        public void onClick(View v){
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mLockNow);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "additional text");
            startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
        }
    };

    private OnClickListener mDisableListener = new OnClickListener(){
        public void onClick(View v){
            mDPM.removeActiveAdmin(mLockNow);
            updateButtonStates();
        }
    };

    private OnClickListener mForceLockListener = new OnClickListener(){
        public void onClick(View v){
            boolean active = mDPM.isAdminActive(mLockNow);
            if (active){
                mDPM.lockNow();
            }
        }
    };


}
  

}


Это манифест:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.locknow"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".LockNow"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity> 
        <activity android:name=".LockNow$Controller">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.SAMPLE_CODE" />
            </intent-filter>
        </activity>
        <receiver android:name=".LockNow"
                  android:label="@string/sample_lock_now"
                  android:permission="android.permission.BIND_DEVICE_ADMIN">
            <intent-filter>
                <action android:name="android.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>                  
        </receiver>
    </application>
</manifest>
  

И ошибка времени выполнения:

 04-27 04:02:47.785: ERROR/AndroidRuntime(1553): FATAL EXCEPTION: main
04-27 04:02:47.785: ERROR/AndroidRuntime(1553): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.locknow/com.example.locknow.LockNow}: java.lang.ClassCastException: com.example.locknow.LockNow
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.os.Looper.loop(Looper.java:123)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.app.ActivityThread.main(ActivityThread.java:4627)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at java.lang.reflect.Method.invokeNative(Native Method)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at java.lang.reflect.Method.invoke(Method.java:521)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at dalvik.system.NativeStart.main(Native Method)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553): Caused by: java.lang.ClassCastException: com.example.locknow.LockNow
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
04-27 04:02:47.785: ERROR/AndroidRuntime(1553):     ... 11 more
  

Я новичок в Java и Android, любая помощь очень ценится!!
Спасибо,
-J

Ответ №1:

Ваш LockNow класс расширяет не any Activity , а Receiver a, поэтому вы должны объявить его таким образом в своем androidManifest.xml . Там вы объявили как activity , так и a receiver для одного и того же LockNow класса.

Необходимо удалить объявление activity:

 <activity android:name=".LockNow" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity> 
  

Оставьте базовый Controller класс как main launcher activity , LockNow класс как receiver .

Ответ №2:

Согласно документации DeviceAdminReceiver не является Activity и, следовательно, его, вероятно, не следует определять как таковой. Согласно примеру, фактический получатель относится к <receiver> тегам.