使用 gson 保存数据和 mediaplayer 服务时出错
getting error wile using gson saving data and mediaplayer service
我正在关注音频播放器的 this 教程。我可以在服务中播放歌曲。但是当我尝试使用 gson 保存歌曲并将数组列表发送到服务时,但是当我点击应用程序崩溃并出现错误的列表项
FATAL EXCEPTION: main
Process: com.example.neelay.level95, PID: 15133
java.lang.RuntimeException: Unable to start service com.example.neelay.level95.MediaPlayerService@79fde5a 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.access00(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.construct(ConstructorConstructor.java:111)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.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.access00(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.construct(ConstructorConstructor.java:108)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.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.access00(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)
服务出错,我收到错误
@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);
}
songutil 出错 class 显示错误
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);
}
我只能知道我在第 106 行遇到服务错误 class
audioList = storage.loadAudio();
并在第 41 行的 songutil class
return gson.fromJson(json, type);
但是我该如何解决这个问题helpfull.Now 当我从 songfileinfo 中删除一些代码时,我可以播放这首歌,这里是代码
public class Songfileinfo implements Serializable {
private String title,album,artist,file_uri;
// 私有 Uri album_art;
// 私人长持续时间;
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;
}
}
但是当我添加这些代码时它仍然崩溃
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;
}
无论出于何种原因它崩溃了,我也将其添加到构造函数中。
我认为问题出在这里;
String json = preferences.getString("audioArrayList", null);
如果prefs中没有audioArrayList,默认为returnsnull。
那么你的
gson.fromJson(json, type);
失控了。顺便说一句,我通常将 Class 设置为我对 json String 类型的期望值。使用
的任何特定原因
Type type = new TypeToken<ArrayList<Songfileinfo>>()
??
基本上 Gson 通过使用 java 反射从 json 构建数据对象。它需要一个空的构造函数。您在数据对象中使用 Uri。所以只需将 Uri 中的地址保存为字符串即可。这将解决问题。
我正在关注音频播放器的 this 教程。我可以在服务中播放歌曲。但是当我尝试使用 gson 保存歌曲并将数组列表发送到服务时,但是当我点击应用程序崩溃并出现错误的列表项
FATAL EXCEPTION: main
Process: com.example.neelay.level95, PID: 15133
java.lang.RuntimeException: Unable to start service com.example.neelay.level95.MediaPlayerService@79fde5a 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.access00(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.construct(ConstructorConstructor.java:111)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.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.access00(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.construct(ConstructorConstructor.java:108)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.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.access00(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)
服务出错,我收到错误
@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);
}
songutil 出错 class 显示错误
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);
}
我只能知道我在第 106 行遇到服务错误 class
audioList = storage.loadAudio();
并在第 41 行的 songutil class
return gson.fromJson(json, type);
但是我该如何解决这个问题helpfull.Now 当我从 songfileinfo 中删除一些代码时,我可以播放这首歌,这里是代码
public class Songfileinfo implements Serializable {
private String title,album,artist,file_uri;
// 私有 Uri album_art; // 私人长持续时间;
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;
}
}
但是当我添加这些代码时它仍然崩溃
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;
}
无论出于何种原因它崩溃了,我也将其添加到构造函数中。
我认为问题出在这里;
String json = preferences.getString("audioArrayList", null);
如果prefs中没有audioArrayList,默认为returnsnull。 那么你的
gson.fromJson(json, type);
失控了。顺便说一句,我通常将 Class 设置为我对 json String 类型的期望值。使用
的任何特定原因Type type = new TypeToken<ArrayList<Songfileinfo>>()
??
基本上 Gson 通过使用 java 反射从 json 构建数据对象。它需要一个空的构造函数。您在数据对象中使用 Uri。所以只需将 Uri 中的地址保存为字符串即可。这将解决问题。