我对Android很新。我需要创建一个应用程序,在概述中显示一组视频,这些视频可以从互联网上的API中检索
这是API的样子:
[{ “名称”: “9VJirQKuoxs”, “图像”: “http://i.ytimg.com/vi/9VJirQKuoxs/default.jpg”}]
这就像我想要的那样。 “name:”是视频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);
}
});
请帮帮我!
EDIT2:
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):at 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):at 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):at dalvik.system.NativeStart.main(Native Method)
编辑:
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);
}
答案 0 :(得分:4)
尝试这样的事情:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=9VJirQKuoxs")));
Android会让您选择打开视频的方式(浏览器或YouTube应用)。 这应该适用于真实设备,但不适用于模拟器。
希望它有所帮助。
答案 1 :(得分: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()来匹配你已经拥有的setter。
更新:由于您在单击列表项时提及nullpointer,因此有一些可能导致它的事情。列表视图,适配器或项目均为空。我建议你在点击监听器的第一行在Eclipse中设置一个断点,看看有什么问题。或者,您可以尝试将AdapterView直接用于get the list item:
@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();
}
}
答案 2 :(得分:0)
试试这个:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId));
intent.putExtra("VIDEO_ID", videoId);
startActivity(intent);
答案 3 :(得分: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;
}
}