1

Je suis this tutoriel pour un lecteur audio. Je suis capable de jouer la chanson en service. Mais quand j'essaie de sauvegarder la chanson en utilisant gson et envoyer l'arraylist au service, mais quand je clique sur l'élément de liste le crash de l'application avec l'erreurobtenir l'erreur wile en utilisant gson sauver des données et mediaplayer service

FATAL EXCEPTION: main 
       Process: com.example.neelay.level95, PID: 15133 
       java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=com.example.neelay.level95/.MediaPlayerService }: java.lang.RuntimeException: Failed to invoke private android.net.Uri() with no args 
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3034) 
        at android.app.ActivityThread.access$2200(ActivityThread.java:153) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5441) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 
       Caused by: java.lang.RuntimeException: Failed to invoke private android.net.Uri() with no args 
        at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:111) 
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210) 
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) 
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) 
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) 
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) 
        at com.google.gson.Gson.fromJson(Gson.java:887) 
        at com.google.gson.Gson.fromJson(Gson.java:852) 
        at com.google.gson.Gson.fromJson(Gson.java:801) 
        at com.example.neelay.level95.StorageUtil.loadAudio(StorageUtil.java:42) 
        at com.example.neelay.level95.MediaPlayerService.onStartCommand(MediaPlayerService.java:106) 
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3017) 
        at android.app.ActivityThread.access$2200(ActivityThread.java:153)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:148)  
        at android.app.ActivityThread.main(ActivityThread.java:5441)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)  
       Caused by: java.lang.InstantiationException: Can't instantiate abstract class android.net.Uri 
        at java.lang.reflect.Constructor.newInstance(Native Method) 
        at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:108) 
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)  
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)  
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)  
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)  
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)  
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)  
        at com.google.gson.Gson.fromJson(Gson.java:887)  
        at com.google.gson.Gson.fromJson(Gson.java:852)  
        at com.google.gson.Gson.fromJson(Gson.java:801)  
        at com.example.neelay.level95.StorageUtil.loadAudio(StorageUtil.java:42)  
        at com.example.neelay.level95.MediaPlayerService.onStartCommand(MediaPlayerService.java:106)  
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3017)  
        at android.app.ActivityThread.access$2200(ActivityThread.java:153)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:148)  
        at android.app.ActivityThread.main(ActivityThread.java:5441)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)  

erreur dans le service où je reçois une erreur

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    try { 

     //Load data from SharedPreferences 
     StorageUtil storage = new StorageUtil(getApplicationContext()); 
     audioList = storage.loadAudio(); 
     audioIndex = storage.loadAudioIndex(); 

     if (audioIndex != -1 && audioIndex < audioList.size()) { 
      //index is in a valid range 
      activeAudio = audioList.get(audioIndex); 
     } else { 
      stopSelf(); 
     } 
    } catch (NullPointerException e) { 
     stopSelf(); 
    } 

    //Request audio focus 
    if (requestAudioFocus() == false) { 
     //Could not gain focus 
     stopSelf(); 
    } 

    if (mediaSessionManager == null) { 
     try { 
      initMediaSession(); 
      initMediaPlayer(); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
      stopSelf(); 
     } 
     buildNotification(PlaybackStatus.PLAYING); 
    } 

    //Handle Intent action from MediaSession.TransportControls 
    handleIncomingActions(intent); 
    return super.onStartCommand(intent, flags, startId); 
} 

erreur dans songutil classe où il affiche l'erreur

public ArrayList<Songfileinfo> loadAudio() { 
    preferences = context.getSharedPreferences(STORAGE, Context.MODE_PRIVATE); 
    Gson gson = new Gson(); 
    String json = preferences.getString("audioArrayList", null); 
    Type type = new TypeToken<ArrayList<Songfileinfo>>() { 
    }.getType(); 
    return gson.fromJson(json, type); 
} 

Je ne suis en mesure de savoir que je reçois une erreur dans la classe de service à la ligne 106 audioList = storage.loadAudio(); et songutil classe à la ligne 41 return gson.fromJson(json, type); mais comment je peux résoudre ce problème toute aide sera helpfull.Now Je suis en mesure de jouer la chanson quand je retire un peu de code de songfileinfo voici le code

public class Songfileinfo implements Serializable { 
private String title,album,artist,file_uri; 

// privé Uri album_art; // privée longue durée;

public Songfileinfo(String data, String title, String album, String artist) { 
    this.file_uri = data; 
    this.title = title; 
    this.album = album; 
    this.artist = artist; 
} 

public Songfileinfo() { 

} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getAlbum() { 
    return album; 
} 

public void setAlbum(String album) { 
    this.album = album; 
} 

public String getArtist() { 
    return artist; 
} 

public void setArtist(String artist) { 
    this.artist = artist; 
} 

public String getFile_uri() { 
    return file_uri; 
} 

public void setFile_uri(String file_uri) { 
    this.file_uri = file_uri; 
} 

}

mais quand j'ajoute thes lises de code, il est encore en train écrasé

private Uri album_art; 
private long duration; 
public Uri getAlbum_art() { 
    return album_art; 
} 

public void setAlbum_art(Uri album_art) { 
    this.album_art = album_art; 
} 

public long getDuration() { 
    return duration; 
} 

public void setDuration(long duration) { 
    this.duration = duration; 
} 

une raison quelconque y est, il se est écrasé je l'ajoute dans le constructeur aussi.

Répondre

1

Fondamentalement, Gson construit l'objet de données à partir de json en utilisant la réflexion java. Il a besoin d'un constructeur vide. Vous utilisez Uri dans votre objet de données. Il suffit donc de sauvegarder l'adresse d'Uri sous forme de chaîne. Cela résoudra le problème.

+0

Si vous voyez le tutoriel, vous verrez ici qu'il est utilisé pour enregistrer la liste du tableau dans la préférence partagée –

+0

Oui, mais ils ne stockent pas "Uri" en utilisant gson bro. Vous ne devriez pas avoir de classe Uri dans votre objet de données. –

0

Je pense que le problème est ici;

String json = preferences.getString("audioArrayList", null); 

S'il n'y a pas de liste audio dans les préférences, elle renvoie NULL par défaut. Ensuite, votre

gson.fromJson(json, type); 

se détraque. BTW, je règle habituellement la classe de ce que j'attends de cette chaîne JSON pour le type. Raison particulière pour utiliser

Type type = new TypeToken<ArrayList<Songfileinfo>>() 

??

+0

bonne année et vous avez raison voir la question de mise à jour j'ai inclus les points importants –

+0

ya j'essaie de sauvegarder la liste de tableau dans la préférence partagée en utilisant gson –