gmusic.api for android - GmHttpClient post()返回null

时间:2013-12-04 08:09:46

标签: android api google-play

我正在使用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

1 个答案:

答案 0 :(得分:0)

解决。

由于使用了无效的Google帐户而发生了这种情况。在我们可以访问此Google Play音乐播放服务之前,我必须首先注册一个Gmail帐户here。然后,我可以使用这个新帐户访问谷歌播放音乐服务&amp; gmusic api。