我正在使用gmusic.api for android 作为我的Android应用程序的库项目。出于身份验证的目的,我从here复制了一个名为GoogleAuthTask的AsyncTask。
public class GoogleAuthTask extends AsyncTask<String, Void, Boolean> {
private Activity mActivity;
public GoogleAuthTask(Activity activity) {
mActivity = activity;
}
@Override
protected Boolean doInBackground(String... params) {
boolean success = false;
try {
String authToken = GoogleAuthUtil.getToken(mActivity, params[0],
"sj");
if (!TextUtils.isEmpty(authToken)) {
GoogleMusicApi.createInstance(mActivity);
success = GoogleMusicApi.login(mActivity, authToken);
if (!success)
GoogleAuthUtil.invalidateToken(mActivity, authToken);
}
} catch (UserRecoverableAuthException e) {
mActivity.startActivityForResult(e.getIntent(), 1001);
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (GoogleAuthException e) {
e.printStackTrace();
}
return success;
}
}
从这个AsyncTask中,在GoogleMusicApi类上调用了static login()方法。
public static final boolean login(Context context, String authToken)
{
if(!TextUtils.isEmpty(authToken))
{
SimpleForm form = new SimpleForm().close();
GoogleMusicApi.setAuthorizationHeader(authToken);
mHttpClient.post(context, "https://play.google.com/music/listen?hl=en&u=0", new ByteArrayEntity(form.toString().getBytes()), form.getContentType());
return true;
}
else
return false;
}
如果我采用这种方法&amp;打印post()调用的响应,它返回null。任何对此帖子的调用都是相同的()。例如,如果我调用getAllSongs(),它会调用post(),并再次返回null。
public static final ArrayList<Song> getAllSongs(Context context) throws JSONException
{
return getSongs(context, "");
}
public static final ArrayList<Song> getSongs(Context context, String continuationToken) throws JSONException
{
SimpleForm form = new SimpleForm();
form.addField("json", "{\"continuationToken\":\"" + continuationToken + "\"}");
form.close();
String response = mHttpClient.post(context, "https://play.google.com/music/services/loadalltracks?u=0&xt=" + getXtCookieValue(), new ByteArrayEntity(form.toString().getBytes()), form.getContentType());
JSONObject jsonObject = new JSONObject(response);
Playlist playlist = new Playlist().fromJsonObject(jsonObject);
ArrayList<Song> chunkedSongList = new ArrayList<Song>();
chunkedSongList.addAll(playlist.getPlaylist());
if(!TextUtils.isEmpty(playlist.getContinuationToken()))
chunkedSongList.addAll(getSongs(context, playlist.getContinuationToken()));
return chunkedSongList;
}
我在这里遗漏了什么吗?我没有找到任何使用这些函数的确切示例。
编辑: 由于post()调用的响应始终为null,因此在调用getAllSongs()时我会得到以下stacktrace:
12-04 14:33:36.640: E/AndroidRuntime(29132): FATAL EXCEPTION: AsyncTask #1
12-04 14:33:36.640:E / AndroidRuntime(29132):java.lang.RuntimeException:执行doInBackground()时发生错误 12-04 14:33:36.640:E / AndroidRuntime(29132):在android.os.AsyncTask $ 3.done(AsyncTask.java:278) 12-04 14:33:36.640:E / AndroidRuntime(29132):at java.util.concurrent.FutureTask $ Sync.innerSetException(FutureTask.java:273) 12-04 14:33:36.640:E / AndroidRuntime(29132):at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 12-04 14:33:36.640:E / AndroidRuntime(29132):at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:307) 12-04 14:33:36.640:E / AndroidRuntime(29132):at java.util.concurrent.FutureTask.run(FutureTask.java:137) 12-04 14:33:36.640:E / AndroidRuntime(29132):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:208) 12-04 14:33:36.640:E / AndroidRuntime(29132):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 12-04 14:33:36.640:E / AndroidRuntime(29132):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:569) 12-04 14:33:36.640:E / AndroidRuntime(29132):at java.lang.Thread.run(Thread.java:856) 12-04 14:33:36.640:E / AndroidRuntime(29132):引起:java.lang.NullPointerException 12-04 14:33:36.640:E / AndroidRuntime(29132):at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116) 12-04 14:33:36.640:E / AndroidRuntime(29132):at org.json.JSONTokener.nextValue(JSONTokener.java:94) 12-04 14:33:36.640:E / AndroidRuntime(29132):at org.json.JSONObject。(JSONObject.java:154) 12-04 14:33:36.640:E / AndroidRuntime(29132):at org.json.JSONObject。(JSONObject.java:171) 12-04 14:33:36.640:E / AndroidRuntime(29132):at com.android.gm.api.GoogleMusicApi.getSongs(GoogleMusicApi.java:146) 12-04 14:33:36.640:E / AndroidRuntime(29132):at com.android.gm.api.GoogleMusicApi.getAllSongs(GoogleMusicApi.java:134) 12-04 14:33:36.640:E / AndroidRuntime(29132):at com.example.testgmusic.MainActivity $ GoogleAuthTask.doInBackground(MainActivity.java:100) 12-04 14:33:36.640:E / AndroidRuntime(29132):at com.example.testgmusic.MainActivity $ GoogleAuthTask.doInBackground(MainActivity.java:1) 12-04 14:33:36.640:E / AndroidRuntime(29132):在android.os.AsyncTask $ 2.call(AsyncTask.java:264) 12-04 14:33:36.640:E / AndroidRuntime(29132):at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:305) 12-04 14:33:36.640:E / AndroidRuntime(29132):... 5 more
答案 0 :(得分:0)
解决。
由于使用了无效的Google帐户而发生了这种情况。在我们可以访问此Google Play音乐播放服务之前,我必须首先注册一个Gmail帐户here。然后,我可以使用这个新帐户访问谷歌播放音乐服务&amp; gmusic api。