zoukankan      html  css  js  c++  java
  • 在Android应用程序使用YouTube API来嵌入视频

    Android版YouTube播放器API使您可以将视频播放功能到你的Android应用程序该API允许您加载和播放YouTube视频(和播放列表),并自定义和控制视频播放体验。

    您可以加载或暗示的视频嵌入到你的应用程序的用户界面的球员视图。然后,您可以通过编程控制播放。例如播放,暂停,或寻求在加载视频的特定点。您可以注册事件侦听器来获取某些事件,比如玩家加载视频或播放状态改变回调。API还具有辅助功能,支持方向的变化,以及过渡到全屏播放。


    使用Android的Youtube API之前,您需要注册您的应用程序,包括您的数字签名的apk在谷歌开发者控制台文件的公证书。要注册应用程序,请按照下列步骤。要开始,创建一个新的项目。我打电话给我VideoTube。在Android Studio的向导的下一个屏幕上选择API 10空白活动MainActivity作为活动的名称。

    1. 进入谷歌开发者控制台
    2. 创建一个新项目。我将其命名VideoTube
    3. 在该项目中创建后出现的页面上,展开API和验证左侧边栏。接下来,单击的API在API的列表,点击YouTube数据API并启用YouTube数据API V3后面的页面上。
    4. 在左侧边栏,选择证书对于资格证书,API支持的OAuth 2.0,使用服务帐户的API密钥和。我们将使用API密钥选项。
    5. 选择API密钥从添加凭据下拉菜单。会显示一个弹出让你指定密钥类型。选择Android的关键接下来选择添加包名和指纹,并添加Android应用程序的包名(我的是com.echessa.videotube),然后在终端中运行以下命令来获取SHA-1证书指纹。
    
    
    keytool -list -v -keystore ~/.android/debug.keystore

    输入android系统提示时作为密码。上位于调试密钥库上面的命令打印资料〜/ .android / debug.keystore您的计算机上。这是通过Eclipse中或Android工作室当你第一次建立了一个Android应用程序自动生成的。在终端方面,你会看到MD5和SHA-1证书指纹。复制SHA-1指纹,并将其粘贴在谷歌开发者控制台,然后点击创建按钮。API密钥将会产生。稍后我们将使用此。

    早在Android应用程序,创建一个名为类Config.java并粘贴以下。

    
    
    package com.echessa.videotube;
    
    /**
     * Created by echessa on 7/17/15.
     */
    public final class Config {
    
        private Config() {
        }
    
        public static final String YOUTUBE_API_KEY = "YOUR API KEY";
    
    }

    粘贴您的API密钥。

    下载(在写作的时候1.2.1)的最新版本的Android版YouTube播放器API的。解压下载的文件,以找到库的jar文件,并且你可以用它来 看看有什么的库提供的一个示例应用程序。JAR文件位于文件夹中。复制并粘贴到你的项目的文件夹中。要访问的库文件夹,使用项目在Android Studio的工程资源管理器的角度来看。然后,展开VideoTube - >程序- >库

    在Android应用程序使用YouTube API来嵌入视频

    变回Android的角度来看,选择的build.gradle(模块:应用程序)文件,并添加以下的依赖关系。

    
    
    compile files('libs/YouTubeAndroidPlayerApi.jar')

    同步项目的文件的gradle。

    添加下面的权限,互联网接入到的AndroidManifest.xml文件作为一个孩子明显标签和同级的应用程序

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

    编辑的strings.xml文件,如图所示。这些都是我们需要的字符串资源。

    
    
    <resources>
        <string name="app_name">VideoTube</string>
        <string name="hello_world">Hello world!</string>
        <string name="action_settings">Settings</string>
        <string name="player_error">Error initializing YouTube player</string>
        <string name="seek_to">Jump To</string>
        <string name="seek_to_hint">Seconds</string>
    </resources>

    接下来,我们将添加一个YouTubePlayerView到布局文件。该视图用于显示YouTube视频。

    修改activity_main.xml中,如图所示。

    
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context=".MainActivity">
    
        <com.google.android.youtube.player.YouTubePlayerView
            android:id="@+id/youtube_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
    </RelativeLayout>

    我们将直接使用YouTubePlayerView在我们的活动,而不是使用YouTubePlayerFragment正因为如此,该活动需要延长YouTubeBaseActivity类。

    修改MainActivity.java如图所示。

    
    
    package com.echessa.videotube;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;
    
    import com.google.android.youtube.player.YouTubeBaseActivity;
    import com.google.android.youtube.player.YouTubeInitializationResult;
    import com.google.android.youtube.player.YouTubePlayer;
    import com.google.android.youtube.player.YouTubePlayer.Provider;
    import com.google.android.youtube.player.YouTubePlayerView;
    
    public class MainActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {
    
        private static final int RECOVERY_REQUEST = 1;
        private YouTubePlayerView youTubeView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
            youTubeView.initialize(Config.YOUTUBE_API_KEY, this);
        }
    
        @Override
        public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) {
            if (!wasRestored) {
                player.cueVideo("fhWaJi1Hsfo"); // Plays https://www.youtube.com/watch?v=fhWaJi1Hsfo
            }
        }
    
        @Override
        public void onInitializationFailure(Provider provider, YouTubeInitializationResult errorReason) {
            if (errorReason.isUserRecoverableError()) {
                errorReason.getErrorDialog(this, RECOVERY_REQUEST).show();
            } else {
                String error = String.format(getString(R.string.player_error), errorReason.toString());
                Toast.makeText(this, error, Toast.LENGTH_LONG).show();
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == RECOVERY_REQUEST) {
                // Retry initialization if user performed a recovery action
                getYouTubePlayerProvider().initialize(Config.YOUTUBE_API_KEY, this);
            }
        }
    
        protected Provider getYouTubePlayerProvider() {
            return youTubeView;
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
    
            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    
    }

    在上面的代码中,我们创建一个类,是的子类YouTubeBaseActivity这需要利用YouTubePlayerView我们实施YouTubePlayer.OnInitializedListener侦听初始化成功或失败。该接口有两个方法,一个名为onInitializationFailure()onInitializationSuccess() 如果初始化成功,cueVideo()方法播放YouTube视频的柜面和失败,会检查错误是否是由用户追讨。

    如果它不是那么错误的吐司是显示给用户,如果它的用户可恢复的,那么getErrorDialog()方法显示一个对话框,使用户能够从错误中恢复。

    例如,如果YouTube应用是不是安装在用户的设备上或已过期,对话将有一个提示,经确认后,将打开谷歌Play商店安装或相应地更新它的用户。如果YouTube应用在设备上禁用,则该提示将打开系统设置为用户启用它。

    当用户从错误恢复对话返回,的onActivityResult()被调用检查,查看是否用户执行的恢复操作。如果是这样,我们重试初始化。

    运行该应用程序,你应该能够发挥在代码中指定的视频。请注意,您将需要您的设备上的YouTube应用。该API客户端库与分布的YouTube应用为Android平台的部分服务进行交互。用户需要运行移动版YouTube应用程式(或更高)的版本4.2.16使用API。通常情况下,运行Android 2.2(升级Froyo)或更高版本有谷歌Play商店应用的设备应该能够运行向上的最新版本的YouTube应用。

    这意味着什么,是,除非你已经安装了谷歌Apps的虚拟设备,您将无法测试在模拟器上的代码。默认的Android模拟器不支持在设备上安装谷歌企业应用套件,但如果你使用的模拟器像Genymotion,你将能够(尽管球队停止对谷歌Apps支持)。即使在我的模拟器安装了谷歌企业应用套件,我仍然无法播放视频。视频缩略图加载没关系的看法,但在攻播放按钮,加载指示灯会出现,但再装载会失败,“连接到服务器丢失”的消息。您可能需要为这个真正的设备。

    在Android应用程序使用YouTube API来嵌入视频

    响应回放事件和状态改变

    在应用中,你可能需要采取取决于YouTube播放器的事件,如缓冲,播放,暂停了一些行动,寻求和停止。您可能需要向用户显示一个消息或覆盖与另一种观点认为,一旦视频播放停止或结束播放器视图。

    YouTubePlayer具有以下接口定义来听这样的事件:

    • YouTubePlayer.PlayerStateChangeListener -接口调用哪个高水平球员的状态发生变化时回调的定义。
    • YouTubePlayer.PlaybackEventListener -接口时,视频播放的事件发生时调用的回调定义。
    • YouTubePlayer.OnFullscreenListener -接口调用哪些回调定义时,打开或关闭全屏的播放器切换,无论是由于用户点击全屏按钮或将呼叫setFullscreen(布尔)
    • YouTubePlayer.PlaylistEventListener -接口时,相关的播放列表的事件发生时调用的回调定义。

    我们将着眼于前两个为这个应用程序。

    下面的方法添加到MainActivity类。

    
    
    private void showMessage(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }

    这将创建传递给函数的消息敬酒。这将节省我们从编写代码的类似的思路。

    接着,下面的两个子类添加到MainActivity类。

    
    
    private final class MyPlaybackEventListener implements YouTubePlayer.PlaybackEventListener {
    
        @Override
        public void onPlaying() {
            // Called when playback starts, either due to user action or call to play().
            showMessage("Playing");
        }
    
        @Override
        public void onPaused() {
            // Called when playback is paused, either due to user action or call to pause().
            showMessage("Paused");
        }
    
        @Override
        public void onStopped() {
            // Called when playback stops for a reason other than being paused.
            showMessage("Stopped");
        }
    
        @Override
        public void onBuffering(boolean b) {
            // Called when buffering starts or ends.
        }
    
        @Override
        public void onSeekTo(int i) {
            // Called when a jump in playback position occurs, either
            // due to user scrubbing or call to seekRelativeMillis() or seekToMillis()
        }
    }
    private final class MyPlayerStateChangeListener implements YouTubePlayer.PlayerStateChangeListener {
    
        @Override
        public void onLoading() {
            // Called when the player is loading a video
            // At this point, it's not ready to accept commands affecting playback such as play() or pause()
        }
    
        @Override
        public void onLoaded(String s) {
            // Called when a video is done loading.
            // Playback methods such as play(), pause() or seekToMillis(int) may be called after this callback.
        }
    
        @Override
        public void onAdStarted() {
            // Called when playback of an advertisement starts.
        }
    
        @Override
        public void onVideoStarted() {
            // Called when playback of the video starts.
        }
    
        @Override
        public void onVideoEnded() {
            // Called when the video reaches its end.
        }
    
        @Override
        public void onError(YouTubePlayer.ErrorReason errorReason) {
            // Called when an error occurs.
        }
    }

    以上创建实现类YouTubePlayer.PlaybackEventListenerYouTubePlayer.PlayerStateChangeListener接口。对于每个类,我已经实现了接口的方法,其中包括调用回调时的注释。你可以把你的每次回调想要的任何行动。在我们的例子,我已经包括了一个吐司输出onPlaying() onPaused()onStopped()当事件发生时会输出一个消息的方法。

    下面的类变量添加到MainActivity文件。

    
    
    private MyPlayerStateChangeListener playerStateChangeListener;
    private MyPlaybackEventListener playbackEventListener;

    下面添加到的底部的onCreate()来初始化上述目的。

    
    
    playerStateChangeListener = new MyPlayerStateChangeListener();
    playbackEventListener = new MyPlaybackEventListener();

    修改onInitializationSuccess() 如图所示。这台对听众YouTubePlayer对象。

    
    
    @Override
    public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) {
        player.setPlayerStateChangeListener(playerStateChangeListener);
        player.setPlaybackEventListener(playbackEventListener);
    
        if (!wasRestored) {
            player.cueVideo("fhWaJi1Hsfo"); // Plays https://www.youtube.com/watch?v=fhWaJi1Hsfo
        }
    }

    运行应用程序,你应该看到,当你开始播放视频出现不同敬酒消息,当您暂停它,当它停止(除被暂停其他原因,如结束视频或播放错误)。

    自定义播放器控制

    在YouTube库确实创造一个不折不扣的现成用户友好的界面来播放YouTube视频的好工作。作为开发人员,你可能想这进一步采取提供,这将使用户在播放更多的控制自定义控件。例如,使他们能够来回跳转视频,或使它们在播放列表播放下一首或上一个视频。

    我们将创造我们的应用程序的控制,使用户可以跳转到视频的具体时间。

    该API提供了两种方法来跳回放:

    • seekToMillis() -搜索到在视频中指定的时间。
    • seekRelativeMillis() -由指定的秒数寻求前进或后退。

    我们将使用第一个跳出来的视频指定的时间。

    修改活动 main.xml_如图所示。

    
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                tools:context=".MainActivity">
    
        <com.google.android.youtube.player.YouTubePlayerView
            android:id="@+id/youtube_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <EditText
                android:id="@+id/seek_to_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:inputType="number"
                android:hint="@string/seek_to_hint"/>
    
            <Button
                android:id="@+id/seek_to_button"
                android:text="@string/seek_to"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
    
        </LinearLayout>
    
    </LinearLayout>

    MainActivity添加以下类变量。

    private YouTubePlayer player;

    onInitializationSuccess()设置此变量。

    this.player = player;

    下面添加到的底部的onCreate()

    final EditText seekToText = (EditText) findViewById(R.id.seek_to_text);
        Button seekToButton = (Button) findViewById(R.id.seek_to_button);
        seekToButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int skipToSecs = Integer.valueOf(seekToText.getText().toString());
                player.seekToMillis(skipToSecs * 1000);
            }
        });

    运行该应用程序,你应该能够输入一个数字(以秒为单位),并有视频跳到这一点。如果输入一个数字,它是比视频的持续时间大时,则视频将跳到结束。

    结论

    在本教程中,我们了解了如何在你的应用程序中嵌入YouTube播放器。如果你希望你的应用程序的用户能够播放YouTube视频,而剩余的在你的应用程序,而不是YouTube应用开来播放视频,然后在用户播放后返回到您的应用程序这是非常方便。

    Android版YouTube库提供了一个很好的API,使您可以自定义此经验,我们仅仅触及了它的能力。要了解更多关于库,一定要通过文档阅读并随附库下载示例应用程序。

    你可以在这里下载完成的项目记得放置在您的密钥Config.java文件。

    如果您尝试教程和你的经历和你有任何问题,我当然很希望听到的。更多资源请访问  源码搜藏网

  • 相关阅读:
    tone() 和 IRremote 冲突的解决办法
    Github
    bit Buffer
    转载:AAC文件解析及解码
    Z变换
    FFT
    DFT
    傅里叶变换
    傅里叶变换--虚部的理解
    转载:WAV header
  • 原文地址:https://www.cnblogs.com/miaoqing/p/5195590.html
Copyright © 2011-2022 走看看