Значение [YoutubePlaylistID] с идентификатором типа java .lang.String не может быть преобразовано в JSONObject. - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать приложение, которое будет использовать YoutTube Api для получения всех идентификаторов видео из плейлиста YouTube. Затем, я надеюсь, приложение отобразит все идентификаторы видео в listView.

Я использую Volley для обработки всех запросов HTTP, я добавил все зависимости Google Api в свой проект, зарегистрировал его. мое приложение на консоли разработчика Google, и я запросил разрешение Inte rnet в моем файле манифеста Android.

Однако я сталкиваюсь с этой ошибкой ( "PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf" - это идентификатор моего списка воспроизведения):

Ошибка запуска

W/System.err: org.json.JSONException: Value PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf at id of type java.lang.String cannot be converted to JSONObject
W/System.err:     at org.json.JSON.typeMismatch(JSON.java:101)
        at org.json.JSONObject.getJSONObject(JSONObject.java:616)
        at com.utilities.dog.MainActivity$1.onResponse(MainActivity.java:102)
        at com.utilities.dog.MainActivity$1.onResponse(MainActivity.java:93)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

Я видел, как люди онлайн сталкивались с такой же проблемой. Очевидно, что определение строковой переменной перед вызовом «.getJSONObject» может решить эту проблему. Тем не менее, это не сработало для меня, поэтому я вернул свой код обратно к тому, что было.

Пожалуйста, посмотрите на мой код:

MainActivity. java

ublic class MainActivity extends AppCompatActivity {

    [...]

    // Playlist URL I want to get data from.
    String url = "https://www.googleapis.com/youtube/v3/playlists?part=contentDetails%2C%20snippet%2C%20id&id=PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf&maxResults=25&key=[My API Key is here]";    

    private void getVideoIDs()
    {
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try{
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray jsonArray = jsonObject.getJSONArray("items");

                    for (int i = 0; i<jsonArray.length(); i++){
                        JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                        JSONObject jsonVideoId =  jsonObject1.getJSONObject("id");
                        String video_id = jsonVideoId.getString("videoID");
                        VideoDetails vd = new VideoDetails();
                        vd.setTitle(video_id);
                        videoDetailsArrayList.add(vd);
                        Toast.makeText(getApplicationContext(), video_id, Toast.LENGTH_SHORT).show();
                    }
                    listView.setAdapter(myCustomAdapter);
                    myCustomAdapter.notifyDataSetChanged();
                }catch(JSONException e){
                    e.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {

                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
            }
        });

        requestQueue.add(stringRequest);
    }
}

VideoDetails. java является публикуемым c классом с методом getter и setter для двух строковых переменных (title, videoId)

Мне также интересно, нужно ли мне вызывать оба ContentDetails и Snippet для получения Идентификаторы видео из плейлиста или, если я могу просто позвонить одному из двух.

Надеюсь, вы мне поможете!

1 Ответ

1 голос
/ 02 мая 2020

Когда необходимо получить всех идентификаторов видео данного списка воспроизведения (в вашем случае PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf), вам следует запросить конечную точку PlaylistItems.list вместо списков воспроизведения. list endpoint.

Это означает замену playlists на playlistItems и id на playlistId в вызывающем URL:

https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails%2C%20snippet%2C%20id&playlistId=PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf&maxResults=25&key=[My API Key is here]

Если вам нужны только идентификаторы видео , тогда достаточно, чтобы параметр part был part=ContentDetails. Эти видео идентификаторы можно найти на items[].contentDetails.videoId.

...