gpt4 book ai didi

android - 无法从youtube/Android APi获取视频演示列表 Activity 功能以与测试应用程序集成-帮助确实需要

转载 作者:行者123 更新时间:2023-12-03 05:25:26 25 4
gpt4 key购买 nike

我正在尝试将YouTube / Androids API的VideoDemoListActivity演示/功能集成到android应用中。我是Java和Android的新手-这是我的第一个问题!我设法找到并安装了来自youtube android api的示例。我已经通过FragmentActivity扩展了VideoListDemoActivity,我已经将xml文件中的片段ID重命名为指向测试站点,将 Activity 包含在 list XML中,并链接了一个标签以显示。但是,在eclipse中没有显示任何错误,当我运行时,除了logcat中的其他错误外,我还得到了FATAL EXCEPTION main。

请注意,我将模拟器重新配置为显示视频等,因此在整个api播放等过程中,我看不到它是模拟器。

这是java类的代码

@TargetApi(13)
public final class VideoListDemoActivity extends FragmentActivity implements OnFullscreenListener {

/** The duration of the animation sliding up the video in portrait. */
private static final int ANIMATION_DURATION_MILLIS = 300;
/** The padding between the video list and the video in landscape orientation. */
private static final int LANDSCAPE_VIDEO_PADDING_DP = 5;

private VideoListFragment listFragment;
private VideoFragment videoFragment;

private View videoBox;
private View closeButton;

private boolean isFullscreen;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.video_list_demo);

listFragment = (VideoListFragment) getFragmentManager().findFragmentById(R.id.list_fragment);
videoFragment =
(VideoFragment) getFragmentManager().findFragmentById(R.id.video_fragment_container);

videoBox = findViewById(R.id.video_box);
closeButton = findViewById(R.id.close_button);

videoBox.setVisibility(View.INVISIBLE);

layout();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

layout();
}

@Override
public void onFullscreen(boolean isFullscreen) {
this.isFullscreen = isFullscreen;

layout();
}

/**
* Sets up the layout programatically for the three different states. Portrait, landscape or
* fullscreen+landscape. This has to be done programmatically because we handle the orientation
* changes ourselves in order to get fluent fullscreen transitions, so the xml layout resources
* do not get reloaded.
*/
private void layout() {
boolean isPortrait =
getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;

listFragment.getView().setVisibility(isFullscreen ? View.GONE : View.VISIBLE);
listFragment.setLabelVisibility(isPortrait);
closeButton.setVisibility(isPortrait ? View.VISIBLE : View.GONE);

if (isFullscreen) {
videoBox.setTranslationY(0); // Reset any translation that was applied in portrait.
setLayoutSize(videoFragment.getView(), MATCH_PARENT, MATCH_PARENT);
setLayoutSizeAndGravity(videoBox, MATCH_PARENT, MATCH_PARENT, Gravity.TOP | Gravity.LEFT);
} else if (isPortrait) {
setLayoutSize(listFragment.getView(), MATCH_PARENT, MATCH_PARENT);
setLayoutSize(videoFragment.getView(), MATCH_PARENT, WRAP_CONTENT);
setLayoutSizeAndGravity(videoBox, MATCH_PARENT, WRAP_CONTENT, Gravity.BOTTOM);
} else {
videoBox.setTranslationY(0); // Reset any translation that was applied in portrait.
int screenWidth = dpToPx(getResources().getConfiguration().screenWidthDp);
setLayoutSize(listFragment.getView(), screenWidth / 4, MATCH_PARENT);
int videoWidth = screenWidth - screenWidth / 4 - dpToPx(LANDSCAPE_VIDEO_PADDING_DP);
setLayoutSize(videoFragment.getView(), videoWidth, WRAP_CONTENT);
setLayoutSizeAndGravity(videoBox, videoWidth, WRAP_CONTENT,
Gravity.RIGHT | Gravity.CENTER_VERTICAL);
}
}

@SuppressLint("NewApi")
public void onClickClose(@SuppressWarnings("unused") View view) {
listFragment.getListView().clearChoices();
listFragment.getListView().requestLayout();
videoFragment.pause();
videoBox.animate()
.translationYBy(videoBox.getHeight())
.setDuration(ANIMATION_DURATION_MILLIS)
.withEndAction(new Runnable() {
@Override
public void run() {
videoBox.setVisibility(View.INVISIBLE);
}
});
}

/**
* A fragment that shows a static list of videos.
*/
public static final class VideoListFragment extends ListFragment {

private static final List<VideoEntry> VIDEO_LIST;
static {
List<VideoEntry> list = new ArrayList<VideoEntry>();
list.add(new VideoEntry("YouTube Collection", "Y_UmWdcTrrc"));
list.add(new VideoEntry("GMail Tap", "1KhZKNZO8mQ"));
list.add(new VideoEntry("Chrome Multitask", "UiLSiqyDf4Y"));
list.add(new VideoEntry("Google Fiber", "re0VRK6ouwI"));
list.add(new VideoEntry("Autocompleter", "blB_X38YSxQ"));
list.add(new VideoEntry("GMail Motion", "Bu927_ul_X0"));
list.add(new VideoEntry("Translate for Animals", "3I24bSteJpw"));
VIDEO_LIST = Collections.unmodifiableList(list);
}

private PageAdapter adapter;
private View videoBox;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new PageAdapter(getActivity(), VIDEO_LIST);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

videoBox = getActivity().findViewById(R.id.video_box);
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
setListAdapter(adapter);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
String videoId = VIDEO_LIST.get(position).videoId;

VideoFragment videoFragment =
(VideoFragment) getFragmentManager().findFragmentById(R.id.video_fragment_container);
videoFragment.setVideoId(videoId);

// The videoBox is INVISIBLE if no video was previously selected, so we need to show it now.
if (videoBox.getVisibility() != View.VISIBLE) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// Initially translate off the screen so that it can be animated in from below.
videoBox.setTranslationY(videoBox.getHeight());
}
videoBox.setVisibility(View.VISIBLE);
}

// If the fragment is off the screen, we animate it in.
if (videoBox.getTranslationY() > 0) {
videoBox.animate().translationY(0).setDuration(ANIMATION_DURATION_MILLIS);
}
}

@Override
public void onDestroyView() {
super.onDestroyView();

adapter.releaseLoaders();
}

public void setLabelVisibility(boolean visible) {
adapter.setLabelVisibility(visible);
}

}

/**
* Adapter for the video list. Manages a set of YouTubeThumbnailViews, including initializing each
* of them only once and keeping track of the loader of each one. When the ListFragment gets
* destroyed it releases all the loaders.
*/
private static final class PageAdapter extends BaseAdapter {

private final List<VideoEntry> entries;
private final List<View> entryViews;
private final Map<YouTubeThumbnailView, YouTubeThumbnailLoader> thumbnailViewToLoaderMap;
private final LayoutInflater inflater;
private final ThumbnailListener thumbnailListener;

private boolean labelsVisible;

public PageAdapter(Context context, List<VideoEntry> entries) {
this.entries = entries;

entryViews = new ArrayList<View>();
thumbnailViewToLoaderMap = new HashMap<YouTubeThumbnailView, YouTubeThumbnailLoader>();
inflater = LayoutInflater.from(context);
thumbnailListener = new ThumbnailListener();

labelsVisible = true;
}

public void releaseLoaders() {
for (YouTubeThumbnailLoader loader : thumbnailViewToLoaderMap.values()) {
loader.release();
}
}

public void setLabelVisibility(boolean visible) {
labelsVisible = visible;
for (View view : entryViews) {
view.findViewById(R.id.text).setVisibility(visible ? View.VISIBLE : View.GONE);
}
}

@Override
public int getCount() {
return entries.size();
}

@Override
public VideoEntry getItem(int position) {
return entries.get(position);
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
VideoEntry entry = entries.get(position);

// There are three cases here
if (view == null) {
// 1) The view has not yet been created - we need to initialize the YouTubeThumbnailView.
view = inflater.inflate(R.layout.video_list_item, parent, false);
YouTubeThumbnailView thumbnail = (YouTubeThumbnailView) view.findViewById(R.id.thumbnail);
thumbnail.setTag(entry.videoId);
thumbnail.initialize(DeveloperKey.DEVELOPER_KEY, thumbnailListener);
} else {
YouTubeThumbnailView thumbnail = (YouTubeThumbnailView) view.findViewById(R.id.thumbnail);
YouTubeThumbnailLoader loader = thumbnailViewToLoaderMap.get(thumbnail);
if (loader == null) {
// 2) The view is already created, and is currently being initialized. We store the
// current videoId in the tag.
thumbnail.setTag(entry.videoId);
} else {
// 3) The view is already created and already initialized. Simply set the right videoId
// on the loader.
thumbnail.setImageResource(R.drawable.loading_thumbnail);
loader.setVideo(entry.videoId);
}
}
TextView label = ((TextView) view.findViewById(R.id.text));
label.setText(entry.text);
label.setVisibility(labelsVisible ? View.VISIBLE : View.GONE);
return view;
}

private final class ThumbnailListener implements
YouTubeThumbnailView.OnInitializedListener,
YouTubeThumbnailLoader.OnThumbnailLoadedListener {

@Override
public void onInitializationSuccess(
YouTubeThumbnailView view, YouTubeThumbnailLoader loader) {
loader.setOnThumbnailLoadedListener(this);
thumbnailViewToLoaderMap.put(view, loader);
view.setImageResource(R.drawable.loading_thumbnail);
String videoId = (String) view.getTag();
loader.setVideo(videoId);
}

@Override
public void onInitializationFailure(
YouTubeThumbnailView view, YouTubeInitializationResult loader) {
view.setImageResource(R.drawable.no_thumbnail);
}

@Override
public void onThumbnailLoaded(YouTubeThumbnailView view, String videoId) {
}

@Override
public void onThumbnailError(YouTubeThumbnailView view, ErrorReason errorReason) {
view.setImageResource(R.drawable.no_thumbnail);
}
}

}

public static final class VideoFragment extends YouTubePlayerFragment
implements OnInitializedListener {

private YouTubePlayer player;
private String videoId;

public static VideoFragment newInstance() {
return new VideoFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

initialize(DeveloperKey.DEVELOPER_KEY, this);
}

@Override
public void onDestroy() {
if (player != null) {
player.release();
}
super.onDestroy();
}

public void setVideoId(String videoId) {
if (videoId != null && !videoId.equals(this.videoId)) {
this.videoId = videoId;
if (player != null) {
player.cueVideo(videoId);
}
}
}

public void pause() {
if (player != null) {
player.pause();
}
}

@Override
public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean restored) {
this.player = player;
player.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT);
player.setOnFullscreenListener((VideoListDemoActivity) getActivity());
if (!restored && videoId != null) {
player.cueVideo(videoId);
}
}

@Override
public void onInitializationFailure(Provider provider, YouTubeInitializationResult result) {
this.player = null;
}

}

private static final class VideoEntry {
private final String text;
private final String videoId;

public VideoEntry(String text, String videoId) {
this.text = text;
this.videoId = videoId;
}
}

// Utility methods for layouting.

private int dpToPx(int dp) {
return (int) (dp * getResources().getDisplayMetrics().density + 0.5f);
}

private static void setLayoutSize(View view, int width, int height) {
LayoutParams params = view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);
}

private static void setLayoutSizeAndGravity(View view, int width, int height, int gravity) {
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
params.width = width;
params.height = height;
params.gravity = gravity;
view.setLayoutParams(params);
}

}

xml文件
    <?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2012 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="95dp"
android:orientation="horizontal"
android:gravity="center"
>

<com.google.android.youtube.player.YouTubeThumbnailView
android:id="@+id/thumbnail"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@drawable/no_thumbnail"
android:adjustViewBounds="true"
android:scaleType="centerInside"/>

<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="#fff"/>

</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2012 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment
class="com.tst1.lister.VideoListDemoActivity$VideoListFragment"
android:id="@+id/list_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

<LinearLayout
android:id="@+id/video_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="vertical">

<ImageButton
android:id="@+id/close_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@android:drawable/btn_dialog"
android:onClick="onClickClose"/>

<fragment
android:id="@+id/video_fragment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
class="com.tst1.lister.VideoListDemoActivity$VideoFragment" />

</LinearLayout>

</merge>

manifest.xml
    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tst1.lister"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />

<uses-permission android:name="android.permission.INTERNET"/>

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:uiOptions="splitActionBarWhenNarrow">

<activity android:name=".about" />
<activity android:name=".video" />
<activity android:name=".more" />



<activity
android:name="com.tst1.lister.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="@string/isLaunchableActivity" android:value="false"/>
</activity>


<activity
android:label="@string/videolist_demo_name"
android:name=".VideoListDemoActivity"
android:configChanges="orientation|keyboardHidden|screenSize">
<meta-data android:name="@string/minVersion" android:value="13"/>
<meta-data android:name="@string/isLaunchableActivity" android:value="true"/>
</activity>

<activity
android:label="@string/playerview_demo_name"
android:name=".PlayerViewDemoActivity"
android:screenOrientation="nosensor"
android:configChanges="orientation|screenSize|keyboardHidden">
<meta-data android:name="@string/minVersion" android:value="8"/>
<meta-data android:name="@string/isLaunchableActivity" android:value="true"/>
</activity>

<activity
android:label="@string/fragment_demo_name"
android:name=".FragmentDemoActivity"
android:screenOrientation="nosensor"
android:configChanges="orientation|screenSize|keyboardHidden">
<meta-data android:name="@string/minVersion" android:value="11"/>
<meta-data android:name="@string/isLaunchableActivity" android:value="true"/>
</activity>

<activity
android:label="@string/player_controls_demo_name"
android:name=".PlayerControlsDemoActivity"
android:windowSoftInputMode="stateHidden">
<meta-data android:name="@string/minVersion" android:value="8"/>
<meta-data android:name="@string/isLaunchableActivity" android:value="true"/>
</activity>



<activity
android:label="@string/standalone_player_demo_name"
android:name=".StandalonePlayerDemoActivity">
<meta-data android:name="@string/minVersion" android:value="8"/>
<meta-data android:name="@string/isLaunchableActivity" android:value="true"/>
</activity>

<activity
android:label="@string/intents_demo_name"
android:name=".IntentsDemoActivity">
<meta-data android:name="@string/minVersion" android:value="8"/>
<meta-data android:name="@string/isLaunchableActivity" android:value="true"/>
</activity>

</application>



</manifest>

原木猫
    05-10 21:25:05.711: I/(3162): Video Item Clicked
05-10 21:25:05.910: D/AndroidRuntime(3162): Shutting down VM
05-10 21:25:05.910: W/dalvikvm(3162): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
05-10 21:25:05.960: E/AndroidRuntime(3162): FATAL EXCEPTION: main
05-10 21:25:05.960: E/AndroidRuntime(3162): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tst1.lister/com.tst1.lister.VideoListDemoActivity}: android.view.InflateException: Binary XML file line #22: Error inflating class fragment
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.ActivityThread.access$600(ActivityThread.java:130)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.os.Handler.dispatchMessage(Handler.java:99)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.os.Looper.loop(Looper.java:137)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.ActivityThread.main(ActivityThread.java:4745)
05-10 21:25:05.960: E/AndroidRuntime(3162): at java.lang.reflect.Method.invokeNative(Native Method)
05-10 21:25:05.960: E/AndroidRuntime(3162): at java.lang.reflect.Method.invoke(Method.java:511)
05-10 21:25:05.960: E/AndroidRuntime(3162): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-10 21:25:05.960: E/AndroidRuntime(3162): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-10 21:25:05.960: E/AndroidRuntime(3162): at dalvik.system.NativeStart.main(Native Method)
05-10 21:25:05.960: E/AndroidRuntime(3162): Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class fragment
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.view.LayoutInflater.inflate(LayoutInflater.java:459)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-10 21:25:05.960: E/AndroidRuntime(3162): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.Activity.setContentView(Activity.java:1867)
05-10 21:25:05.960: E/AndroidRuntime(3162): at com.tst1.lister.VideoListDemoActivity.onCreate(VideoListDemoActivity.java:68)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.Activity.performCreate(Activity.java:5008)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
05-10 21:25:05.960: E/AndroidRuntime(3162): ... 11 more
05-10 21:25:05.960: E/AndroidRuntime(3162): Caused by: java.lang.ClassCastException: com.tst1.lister.VideoListDemoActivity$VideoListFragment cannot be cast to android.support.v4.app.Fragment
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.support.v4.app.Fragment.instantiate(Fragment.java:394)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.support.v4.app.Fragment.instantiate(Fragment.java:369)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272)
05-10 21:25:05.960: E/AndroidRuntime(3162): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
05-10 21:25:05.960: E/AndroidRuntime(3162): ... 21 more
05-10 21:30:06.060: I/Process(3162): Sending signal. PID: 3162 SIG: 9
05-10 21:30:06.830: E/Trace(3177): error opening trace file: No such file or directory (2)
05-10 21:30:07.860: D/gralloc_goldfish(3177): Emulator without GPU emulation detected.

最佳答案

我也是菜鸟,但我已经列出了 list 。

有关更多信息,请复制此code

您也可以访问link,其中剩下的一段代码Tab1Activity.java包含列表所需的所有内容

关于android - 无法从youtube/Android APi获取视频演示列表 Activity 功能以与测试应用程序集成-帮助确实需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16492859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com