2013-08-17 3 views
2

У меня есть программа, и я использую ниже код для загрузки классов android.media.RemoteControlClient android.media.RemoteControlClient.MetadataEditor * * дает ошибку android.media.MediaMetadataRetrieverClass.forName андроид NoClassDefFoundError -> ClassNotFoundException

каждый класс нагрузки, кроме одного, только одна строка дает другие ошибки работать нормально

try{ 
     mRemoteControlClass=Class.forName("android.media.RemoteControlClient"); 

     //this gives the error 
     MetadataEditorC=Class.forName("android.media.RemoteControlClient.MetadataEditor"); 

     MediaMetadataRetrieverC=Class.forName("android.media.MediaMetadataRetriever"); 

     Log.e("RemoteControlClient", "Succesfully Set Metadata"); 
     }catch(Exception e){e.printStackTrace(); 
      Log.e("RemoteControlClient", "ERROR Set Metadata");} 

это трассировки стека

08-17 16:17:17.621: W/System.err(1771): java.lang.ClassNotFoundException: android.media.RemoteControlClient.MetadataEditor 
08-17 16:17:17.621: W/System.err(1771):  at java.lang.Class.classForName(Native Method) 
08-17 16:17:17.621: W/System.err(1771):  at java.lang.Class.forName(Class.java:217) 
08-17 16:17:17.621: W/System.err(1771):  at com.SmoothApps.iSenseMusic.MyRemoteControlClient.updatemetadata(MyRemoteControlClient.java:94) 
08-17 16:17:17.621: W/System.err(1771):  at com.SmoothApps.iSenseMusic.iSenseMusic.setNotify(iSenseMusic.java:296) 
08-17 16:17:17.621: W/System.err(1771):  at com.SmoothApps.iSenseMusic.iSenseMusic.onStartCommand(iSenseMusic.java:421) 
08-17 16:17:17.621: W/System.err(1771):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2656) 
08-17 16:17:17.621: W/System.err(1771):  at android.app.ActivityThread.access$1900(ActivityThread.java:141) 
08-17 16:17:17.621: W/System.err(1771):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331) 
08-17 16:17:17.621: W/System.err(1771):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-17 16:17:17.621: W/System.err(1771):  at android.os.Looper.loop(Looper.java:137) 
08-17 16:17:17.621: W/System.err(1771):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
08-17 16:17:17.621: W/System.err(1771):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-17 16:17:17.621: W/System.err(1771):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-17 16:17:17.621: W/System.err(1771):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-17 16:17:17.621: W/System.err(1771):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
08-17 16:17:17.621: W/System.err(1771):  at dalvik.system.NativeStart.main(Native Method) 
08-17 16:17:17.621: W/System.err(1771): Caused by: java.lang.NoClassDefFoundError: android/media/RemoteControlClient/MetadataEditor 
08-17 16:17:17.621: W/System.err(1771):  ... 16 more 
08-17 16:17:17.621: W/System.err(1771): Caused by: java.lang.ClassNotFoundException: android.media.RemoteControlClient.MetadataEditor 
08-17 16:17:17.621: W/System.err(1771):  at java.lang.VMClassLoader.loadClass(Native Method) 
08-17 16:17:17.621: W/System.err(1771):  at java.lang.BootClassLoader.findClass(ClassLoader.java:765) 
08-17 16:17:17.621: W/System.err(1771):  at java.lang.BootClassLoader.loadClass(ClassLoader.java:825) 
08-17 16:17:17.621: W/System.err(1771):  at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
08-17 16:17:17.621: W/System.err(1771):  ... 16 more 
08-17 16:17:17.621: W/System.err(1771): Caused by: java.lang.NoClassDefFoundError: [generic] 
08-17 16:17:17.621: W/System.err(1771):  ... 1 more 

Если я попробую другой подход, тогда все будет работать, но это не идеальное кодирование или дружественный к компьютеру, мне нужно загрузить все подкласс суперкласса, а затем проверить имена и работать как i, закодированные ниже (я не знаю, почему простой процесс я использовал выше не работает)

Class[] cls=mRemoteControlClass.getDeclaredClasses(); 
      for(int i=0;i<cls.length;i++){ 
       //Log.e("CLASS "+(i+1),cls[i].getName()); 
       if(cls[i].getName().contains("MetadataEditor")) 
       MetadataEditorC=cls[i]; 
      } 

, что я могу догадаться, что thenclass MetaDataEditor не имеет определения класса, поэтому он не может быть загружен. Но другим способом я могу загрузить его.

Надеюсь, что есть простой способ загрузить класс, я не очень хорошо знаком с загрузкой класса java, пожалуйста, помогите.

ответ

2

Попробуйте эти обозначения (см $):

MetadataEditorC=Class.forName(
     "android.media.RemoteControlClient$MetadataEditor"); 

Это, как правило, используется для ссылки на внутренний класс.

+0

Он работал, когда я попробовал снова после вашего ответа. Я не знаю, почему это не сработало, когда я попытался раньше (я, вероятно, сделал некоторую ошибку). Спасибо за быстрый ответ, это здорово. Спасибо, сэр – Diljeet

Смежные вопросы