SOを見てきましたが、同様の質問が1つ見つかりましたが、役に立ちませんでした。
初めての Android アプリケーションを作成しました。このアプリケーションは、動画の動的リストを使用して YouTube チャンネルの動画を再生する必要があります。Android エミュレータでアプリケーションを実行していますが、アプリケーションで動画のサムネイルをクリックすると、YouTube のメイン ページに移動します。
エミュレーターのターゲットに何かあるのかわかりません。
私はこれに関するオンラインチュートリアルに従いました。
これはMain.java
ビデオ用です:
/**
* The Activity can retrieve Videos for a specific username from YouTube</br>
* It then displays them into a list including the Thumbnail preview and the title</br>
* There is a reference to each video on YouTube as well but this isn't used in this tutorial</br>
* </br>
* <b>Note<b/> orientation change isn't covered in this tutorial, you will want to override
* onSaveInstanceState() and onRestoreInstanceState() when you come to this
* </br>
* @author paul.blundell
*/
public class maincontentview extends Activity implements VideoClickListener {
// A reference to our list that will hold the video details
private VideosListView listView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maincontentview);
listView = (VideosListView) findViewById(R.id.videosListView);
listView.setOnVideoClickListener(this);
}
// This is the XML onClick listener to retreive a users video feed
public void getUserYouTubeFeed(View v){
// We start a new task that does its work on its own thread
// We pass in a handler that will be called when the task has finished
// We also pass in the name of the user we are searching YouTube for
new GetYouTubeUserVideosTask(responseHandler, "projectofdawah").run();
}
// This is the handler that receives the response when the YouTube task has finished
Handler responseHandler = new Handler() {
public void handleMessage(Message msg) {
populateListWithVideos(msg);
};
};
/**
* This method retrieves the Library of videos from the task and passes them to our ListView
* @param msg
*/
private void populateListWithVideos(Message msg) {
// Retreive the videos are task found from the data bundle sent back
Library lib = (Library) msg.getData().get(GetYouTubeUserVideosTask.LIBRARY);
// Because we have created a custom ListView we don't have to worry about setting the adapter in the activity
// we can just call our custom method with the list of items we want to display
listView.setVideos(lib.getVideos());
}
@Override
protected void onStop() {
// Make sure we null our handler when the activity has stopped
// because who cares if we get a callback once the activity has stopped? not me!
responseHandler = null;
super.onStop();
}
// This is the interface method that is called when a video in the listview is clicked!
// The interface is a contract between this activity and the listview
@Override
public void onVideoClicked(com.mohammed.watzIslam.Video video) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(video.getUrl()));
startActivity(intent);
}
}
これはビデオ Java ファイルです
package com.mohammed.watzIslam;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore.Video;
import android.view.View;
/**
* The Activity can retrieve Videos for a specific username from YouTube</br>
* It then displays them into a list including the Thumbnail preview and the title</br>
* There is a reference to each video on YouTube as well but this isn't used in this tutorial</br>
* </br>
* <b>Note<b/> orientation change isn't covered in this tutorial, you will want to override
* onSaveInstanceState() and onRestoreInstanceState() when you come to this
* </br>
*/
public class maincontentview extends Activity implements VideoClickListener {
// A reference to our list that will hold the video details
private VideosListView listView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maincontentview);
listView = (VideosListView) findViewById(R.id.videosListView);
listView.setOnVideoClickListener(this);
}
// This is the XML onClick listener to retreive a users video feed
public void getUserYouTubeFeed(View v){
// We start a new task that does its work on its own thread
// We pass in a handler that will be called when the task has finished
// We also pass in the name of the user we are searching YouTube for
new GetYouTubeUserVideosTask(responseHandler, "projectofdawah").run();
}
// This is the handler that receives the response when the YouTube task has finished
Handler responseHandler = new Handler() {
public void handleMessage(Message msg) {
populateListWithVideos(msg);
};
};
/**
* This method retrieves the Library of videos from the task and passes them to our ListView
* @param msg
*/
private void populateListWithVideos(Message msg) {
// Retreive the videos are task found from the data bundle sent back
Library lib = (Library) msg.getData().get(GetYouTubeUserVideosTask.LIBRARY);
// Because we have created a custom ListView we don't have to worry about setting the adapter in the activity
// we can just call our custom method with the list of items we want to display
listView.setVideos(lib.getVideos());
}
@Override
protected void onStop() {
// Make sure we null our handler when the activity has stopped
// because who cares if we get a callback once the activity has stopped? not me!
responseHandler = null;
super.onStop();
}
// This is the interface method that is called when a video in the listview is clicked!
// The interface is a contract between this activity and the listview
@Override
public void onVideoClicked(com.mohammed.watzIslam.Video video) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(video.getUrl()));
startActivity(intent);
}
}
これはビデオlistview.javaです
package com.mohammed.watzIslam;
import java.util.List;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
public class VideosListView extends ListView implements android.widget.AdapterView.OnItemClickListener {
private List<Video> videos;
private VideoClickListener videoClickListener;
public VideosListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public VideosListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VideosListView(Context context) {
super(context);
}
public void setVideos(List<Video> videos){
this.videos = videos;
VideosAdapter adapter = new VideosAdapter(getContext(), videos);
setAdapter(adapter);
// When the videos are set we also set an item click listener to the list
// this will callback to our custom list whenever an item it pressed
// it will tell us what position in the list is pressed
setOnItemClickListener(this);
}
// Calling this method sets a listener to the list
// Whatever class is passed in will be notified when the list is pressed
// (The class that is passed in just has to 'implement VideoClickListener'
// meaning is has the methods available we want to call)
public void setOnVideoClickListener(VideoClickListener l) {
videoClickListener = l;}
@Override
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
}
// When we receive a notification that a list item was pressed
// we check to see if a video listener has been set
// if it has we can then tell the listener 'hey a video has just been clicked' also passing the video
@Override
public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
if(videoClickListener != null){
videoClickListener.onVideoClicked(videos.get(position));
}
}
}
ログキャット
05-09 09:10:58.080: I/Choreographer(914): Skipped 64 frames! The application may be doing too much work on its main thread.
05-09 09:11:33.139: E/Trace(968): error opening trace file: No such file or directory (2)
05-09 09:11:34.219: D/dalvikvm(968): GC_FOR_ALLOC freed 48K, 3% free 8014K/8259K, paused 81ms, total 83ms
05-09 09:11:34.269: I/dalvikvm-heap(968): Grow heap (frag case) to 8.977MB for 1156016-byte allocation
05-09 09:11:34.459: D/dalvikvm(968): GC_CONCURRENT freed 1K, 3% free 9142K/9415K, paused 82ms+30ms, total 186ms
05-09 09:11:35.400: D/gralloc_goldfish(968): Emulator without GPU emulation detected.
05-09 09:11:38.101: D/dalvikvm(968): GC_CONCURRENT freed 19K, 2% free 9572K/9735K, paused 94ms+109ms, total 311ms
05-09 09:11:38.740: I/Choreographer(968): Skipped 141 frames! The application may be doing too much work on its main thread.
05-09 09:11:39.490: I/Choreographer(968): Skipped 98 frames! The application may be doing too much work on its main thread.
05-09 09:11:41.310: I/Choreographer(968): Skipped 32 frames! The application may be doing too much work on its main thread.
05-09 09:11:42.190: I/Choreographer(968): Skipped 30 frames! The application may be doing too much work on its main thread.
05-09 09:11:51.540: I/Choreographer(968): Skipped 38 frames! The application may be doing too much work on its main thread.
05-09 09:11:51.850: I/Choreographer(968): Skipped 55 frames! The application may be doing too much work on its main thread.
05-09 09:11:58.519: D/Button(968): Login
05-09 09:11:59.860: E/JSON(968): {"tag":"login","success":1,"error":0,"id":"518a7c7904eda1.69983308","user":{"name":"a","email":"a","created_at":"2013-05-09 00:25:29","updated_at":null}}
05-09 09:12:02.620: I/Choreographer(968): Skipped 35 frames! The application may be doing too much work on its main thread.
05-09 09:12:10.931: D/dalvikvm(968): GC_CONCURRENT freed 197K, 3% free 9837K/10119K, paused 74ms+91ms, total 273ms
05-09 09:12:15.679: I/Choreographer(968): Skipped 38 frames! The application may be doing too much work on its main thread.
05-09 09:12:17.450: I/Choreographer(968): Skipped 76 frames! The application may be doing too much work on its main thread.
05-09 09:12:17.651: I/Choreographer(968): Skipped 39 frames! The application may be doing too much work on its main thread.
05-09 09:12:22.071: I/System.out(968): https://www.youtube.com/watch?v=hBiyaXMVM90&feature=youtube_gdata_player
05-09 09:12:22.071: I/System.out(968): https://www.youtube.com/watch?v=hBiyaXMVM90&feature=youtube_gdata_player
05-09 09:12:22.630: D/dalvikvm(968): GC_CONCURRENT freed 1603K, 17% free 8807K/10503K, paused 87ms+83ms, total 259ms
05-09 09:12:22.630: D/dalvikvm(968): WAIT_FOR_CONCURRENT_GC blocked 31ms
05-09 09:12:23.470: I/System.out(968): URL :- hBiyaXMVM90
05-09 09:12:23.590: I/Choreographer(968): Skipped 339 frames! The application may be doing too much work on its main thread.
05-09 09:12:24.561: D/MediaPlayer(968): Couldn't open file on client side, trying server side
05-09 09:12:24.931: I/Choreographer(968): Skipped 304 frames! The application may be doing too much work on its main thread.
05-09 09:12:25.450: D/MediaPlayer(968): getMetadata
05-09 09:12:25.591: I/Choreographer(968): Skipped 37 frames! The application may be doing too much work on its main thread.
05-09 09:12:31.744: E/MediaPlayer(968): error (1, -2147483648)
05-09 09:12:31.744: E/MediaPlayer(968): Error (1,-2147483648)
05-09 09:12:31.750: D/VideoView(968): Error: 1,-2147483648
05-09 09:12:32.140: I/Choreographer(968): Skipped 59 frames! The application may be doing too much work on its main thread.
05-09 09:12:33.560: I/Choreographer(968): Skipped 59 frames! The application may be doing too much work on its main thread.
皆さんからの助けを願っています