1

我对Android很陌生。我需要制作一个应用程序,在从互联网上的 API 检索的概览中显示一堆视频

下面是 API 的样子:

[{"名称":"9VJirQKuoxs","图片":"http://i.ytimg.com/vi/9VJirQKuoxs/default.jpg"}]

这如我所愿。“名称:”是视频 ID,我需要打开 Youtube 应用程序并打开这个特定的视频。我该如何打开这个?我来自 PHP 开发,我无法弄清楚,因为我仍处于“网络”状态。谁能让我走上正确的道路?或者甚至可以提供一个例子?

谢谢,如果我需要提供代码,请询问。

编辑:

我测试打开 youtube 应用程序并且它可以工作,但我需要在已单击的特定项目上打开应用程序。

如何获取点击项目的变量?在这种情况下,变量是一个名为 video_id 的字符串,这是创建变量的部分:

String url = params[0];
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(url);
            HttpResponse response;
            response = client.execute(get);
            InputStream content = response.getEntity().getContent();
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(content));
            String line;
            String json = "";
            while ((line = reader.readLine()) != null) {
                json += line;
            }

            JSONArray array = new JSONArray(json);
            ArrayList<JSONFields> alData = new ArrayList<JSONFields>();
            for (int i = 0; i < array.length(); i++) {

                JSONFields data = new JSONFields();
                JSONObject obj = array.getJSONObject(i);

                data.setName(obj.getString("name"));
                data.setUrl(obj.getString("url"));
                data.setVideoid(obj.getString("name"));

                alData.add(data);
            }
            System.out.println("Data returned sucessfully");
            return alData;

这是 onclick 监听器

listview = (ListView) findViewById(R.id.listView1);
    listview.setClickable(true);
    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

            System.out.println(arg3);
           }
        });

请帮帮我!

编辑2:

package com.bounty4u.jsonparsing.data;

public class JSONFields {

    private String name;
    private String url;
    private String video_id;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public void setVideoid(String video_id){
        this.video_id = video_id;
    }

    public String getVideoid(){
        return video_id;
    }
}

这也是错误日志:

05-22 16:44:42.280:E/AndroidRuntime(24776):致命异常:主要 05-22 16:44:42.280:E/AndroidRuntime(24776):java.lang.NullPointerException 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.bounty4u.jsonparsing.MainActivity$1.onItemClick(MainActivity.java:49) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.widget.AdapterView.performItemClick( AdapterView.java:298) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.widget.AbsListView.performItemClick(AbsListView.java:1202) 05-22 16:44:42.280: E/AndroidRuntime( 24776): 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:2975) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.widget.AbsListView$1.run(AbsListView.java: 3657) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Handler.handleCallback(Handler.java:615) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Handler.dispatchMessage(Handler.java:92) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Looper.loop(Looper .java:137) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16:44:42.280: E/AndroidRuntime(24776 ): at java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): at java.lang.reflect.Method.invoke(Method.java:511) 05 -22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776 ): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 dalvik.system.NativeStart.main(Native Method)E/AndroidRuntime(24776): 在 android.os.Handler.dispatchMessage(Handler.java:92) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Looper.loop(Looper.java :137) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16:44:42.280: E/AndroidRuntime(24776):在 java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invoke(Method.java:511) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 dalvik.system.NativeStart.main(Native Method)E/AndroidRuntime(24776): 在 android.os.Handler.dispatchMessage(Handler.java:92) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Looper.loop(Looper.java :137) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16:44:42.280: E/AndroidRuntime(24776):在 java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invoke(Method.java:511) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 dalvik.system.NativeStart.main(Native Method)在 android.os.Handler.dispatchMessage(Handler.java:92) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Looper.loop(Looper.java:137) 05-22 16 :44:42.280: E/AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect。 Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): at java.lang.reflect.Method.invoke(Method.java:511) 05-22 16:44:42.280: E /AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): at dalvik.system.NativeStart.main(Native Method)在 android.os.Handler.dispatchMessage(Handler.java:92) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Looper.loop(Looper.java:137) 05-22 16 :44:42.280: E/AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect。 Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): at java.lang.reflect.Method.invoke(Method.java:511) 05-22 16:44:42.280: E /AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): at dalvik.system.NativeStart.main(Native Method)dispatchMessage(Handler.java:92) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Looper.loop(Looper.java:137) 05-22 16:44:42.280: E/ AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invoke(Method.java:511) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 dalvik.system.NativeStart.main(Native Method)dispatchMessage(Handler.java:92) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.os.Looper.loop(Looper.java:137) 05-22 16:44:42.280: E/ AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invoke(Method.java:511) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 dalvik.system.NativeStart.main(Native Method)在 android.os.Looper.loop(Looper.java:137) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16 :44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method .invoke(Method.java:511) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16 :44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 dalvik。 system.NativeStart.main(本机方法)在 android.os.Looper.loop(Looper.java:137) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 android.app.ActivityThread.main(ActivityThread.java:4765) 05-22 16 :44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method .invoke(Method.java:511) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16 :44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 dalvik。 system.NativeStart.main(本机方法)4765) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java .lang.reflect.Method.invoke(Method.java:511) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 786) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime( 24776):在 dalvik.system.NativeStart.main(本机方法)4765) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java.lang.reflect.Method.invokeNative(Native Method) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 java .lang.reflect.Method.invoke(Method.java:511) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 786) 05-22 16:44:42.280: E/AndroidRuntime(24776): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280: E/AndroidRuntime( 24776):在 dalvik.system.NativeStart.main(本机方法)ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280:E/AndroidRuntime(24776):在 dalvik.system.NativeStart.main(本机方法)ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 05-22 16:44:42.280: E/AndroidRuntime(24776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-22 16:44:42.280:E/AndroidRuntime(24776):在 dalvik.system.NativeStart.main(本机方法)

编辑:

    JSONArray array = new JSONArray(json);
            ArrayList<JSONFields> alData = new ArrayList<JSONFields>();
            for (int i = 0; i < array.length(); i++) {

                JSONFields data = new JSONFields();
                JSONObject obj = array.getJSONObject(i);

                data.setName(obj.getString("name"));
                data.setUrl(obj.getString("url"));
                data.setVideoid(obj.getString("video_id"));
                System.out.println("Video ID: " + obj.getString("video_id"));

                alData.add(data);
            }
4

4 回答 4

4

尝试这样的事情:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=9VJirQKuoxs")));

Android 将让您选择要打开视频的方式(浏览器或 youtube 应用程序)。这应该适用于真实设备,但不适用于模拟器。

希望能帮助到你。

于 2013-05-22T12:02:23.390 回答
2

看看YouTubeIntents。这是“一组静态方法,用于创建导航到 YouTube 主应用程序中特定活动的意图。”

您感兴趣的意图是YouTubeIntents.createPlayVideoIntent(context,videoId)

/**
 * Put this in your activity
 */
public void playVideo(String videoId) {
    if(YouTubeIntents.canResolvePlayVideoIntent(this)) {
        Intent i = YouTubeIntents.createPlayVideoIntent(this, videoId);
        startActivity(i);
    }
}

至于从单击的列表项中获取 videoId,它在一定程度上取决于您如何创建列表并将数据传递给它。您是否将返回的列表(在您的示例中名为“alData”)传递给列表适配器?您可能可以在 AdapterView.onItemClick() 中执行以下操作:

JSONFields data = (JSONFields)listview.getAdapter().getItem(position);
String videoId = data.getVideoId();

我在这里做了一堆假设。首先,我假设您的列表由一堆 JSONField 对象表示(您的 JSON 解析函数似乎表明了这一点)。其次,我假设有一个 JSONField.getVideoId() 来匹配您已经拥有的设置器。

更新:由于您在单击列表项时提到了一个空指针,因此有几件事可能会导致它。列表视图、适配器或项目为空。我建议您在 Eclipse 中单击侦听器的第一行设置一个断点,看看有什么问题。或者,您可以尝试直接使用 AdapterView 来获取列表项

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
    JSONField item = (JSONField)arg0.getItemAtPosition(position);
    if(item != null) {
        String videoId = item.getVideoId();     
    }
}
于 2013-05-22T12:05:03.470 回答
0

我使用上面 Damien R 的建议创建了一个更完整的示例。如果它对您有用,那么错误必须在您的列表处理代码中的其他位置。

package com.redchillipadi.youtube;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String videoID = "9VJirQKuoxs";
        //TODO: Sanitize input to prevent code injection
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v="+videoID)));
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
于 2013-06-11T10:33:00.157 回答
0

尝试这个:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId)); 
intent.putExtra("VIDEO_ID", videoId); 
startActivity(intent); 
于 2013-06-11T08:49:45.723 回答