유니티로 다른 사람들이 만든 게임들을 만지다 보면 2017년도 이전에 만든 소스들을 종종 보게 됩니다.

그러면 게임은 너무 잘 만들어져 있는데 컴파일하고 출시하려고 보면 64bit 지원이 안되어서 낭패를 보게 되는 경험을 하게 됩니다.

 

구글플레이 정책상 2019년 8월 1일부터 플레이스토어에 올라가는 모든 어플들은 64비트를 지원하게 하였습니다.

 

이에 따라 유니티 빌드 셋팅도 바꾸어야 했습니다.

아래 화면은 Unity 2017.1.5f1 에디터 화면입니다.

 

Device Filter 부분에 ARMv7+x86으로 팝업메뉴에도 ARM64은 아예 없습니다.

 

유니티에서 64bit를 지원하는 ARM64을 포함하는 버전은 Unity 2017.4.18f1 부터입니다.

아래 화면은 Unity 2017.4.18f1 에디터의 셋팅 화면입니다.

 

 

ARM64이 포함되어 있는것을 볼 수 있습니다. 

ARM64를 포함해서 빌드를 해야하고 Scripting Backend는 IL2CPP로 선택해야 합니다.

 

이렇게 ARM64를 체크해서 빌드가 잘 끝나면 다행인데요.

그럼에도 불구하고 곳곳에서 에러를 뿜어낼 것입니다.

IL2CPP로 컴파일하게 되면 우선 JDK,NDK,SDK 인클루드에 관한 에러가 날 것입니다.

 

그러면 Edit->Preferences->External Tools로 가서 

 

 

각자 PC에 맞는 경로를 맞춰주면 됩니다.

NDK관련 경고 에러가 난다면 유니티 허브에서 NDK관련 모듈을 설치해 주시면 됩니다.

 

 

이제 64bit는 다 작업이 끝났을것으로 생각할 수 있습니다. apk 파일을 만들고 구글 플레이 콘솔에서 등록을 하는 순간

콘솔에서 에러를 보실 수도 있습니다.

 

이런 경우에는 대부분이 Android App Bundle 게시 형식이 아닌 apk 형식의 파일을 올렸을 경우 발생합니다.

 

위와 같이 App Bundle 형식으로 빌드를 하면 되겠습니다.

 

64bit 대응에 대해 알아보았습니다. 천천히 따라가다 보면 쉽게 해결하실 수 있습니다.

 

앞전 시간에는 구글애즈 계정관련 셋팅과 구글 인증 셋팅을 마쳤습니다.

이제 마지막으로 API를 사용해 볼 수 있는 시간입니다.

라이브러리 셋팅과 웹서버 셋팅을 알아보겠습니다.

 

먼저 구글애즈 API 라이브러리가 있는 곳에서 다운을 받습니다.

https://github.com/googleads/google-ads-php

 

googleads/google-ads-php

Google Ads API Client Library for PHP. Contribute to googleads/google-ads-php development by creating an account on GitHub.

github.com

컴포져로 설치하기전에 확인해야할 요구사항들이 있습니다.

 

PHP - composer.json 파일에 최소한의 PHP 버전이 설치되어 있어야 합니다.

 

gRPC - PHP 확장모듈인 grpc 설치가 되어 있어야 합니다.  

sudo pecl install grpc

 grpc  설치를 합니다.

 extension=grpc.so

 php.ini 에 추가합니다.

 

 

Protobuf - PHP 확장모듈인 Protobuf가 설치되어야 합니다.

sudo pecl install protobuf

grpc  설치를 합니다.

extension=protobuf.so

 php.ini 에 추가합니다.

 

 

1. 요구사항을 다 설치한후 다운로드 받은후 웹서버 루트에서 압축을 풀어줍니다.

# git clone https://github.com/googleads/google-ads-php.git

2. google-ads-php 디렉토리로 변경합니다.

# cd google-ads-php

여러개의 폴더와 파일들이 보입니다.

compser.json - 라이브러리의 요구사항을 포함하는 json 파일

src - 라이브러리 소스 코드

tests - 라이브러리 코드 테스트

examples - 라이브러리를 사용해서 구글애즈 api  사용한 일반적인 예제들

metadata - 소스 코드에서 내부적으로 사용하는 일부 메타데이터 파일

 

3. composer install 로 컴포져를 설치합니다.

compser install

 

4. OAuth2 자격 증명을 설정합니다.

 

- 애드워즈 api에 대한 자격증명이 이미 있는 경우

   기존 adsapi_php.ini 파일을 복사하여 google_ads_php.ini 로 이름을 바꾸고 섹션이름을 [ADWORDS] -> [GOOGLE_ADS]로 바꿉니다.

   파일이 없는 경우 google_ads_php.ini를 홈 디렉토리에 복사합니다. 

 

- 새로운 자격증명을 사용하여 Google Ads API에 액세스 하는 경우

   샘플 폴더에 있는 google_ads_php.ini 파일을 홈디렉토리에 복사합니다.

   https://developers.google.com/google-ads/api/docs/oauth/cloud-project를  따라 OAuth2 클라이언트 ID 및 비밀번호를 만듭니다.

   AuthenticateInStandaloneApplication 예제를 실행하면 OAuth2 클라이언트 ID와 암호를 입력하라는 메시지가 표시됩니다.

   예제의 마지막 단계에서 출력을 google_ads_php.ini 파일을 홈디렉토리에 복사합니다. 개발자 토큰도 입력하는것을 빼먹지 마세요.

 

 

5. GetCampaigns.php 파일을 실행해서 자격 증명이 유효한지 확인합니다.

 

php examples/BasicOperations/GetCampaigns.php --customerId <YOUR_CUSTOMER_ID>

   

'기타' 카테고리의 다른 글

Google Adsense Api 사용법(1/2)  (0) 2020.08.27
Google Ads Api 사용법(2/3)  (0) 2020.08.19
Google Ads Api 사용법(1/3)  (0) 2020.08.19

composer는 php에서 종속성 관리를 위한 도구입니다. 프로젝트가 의존하는 라이브러리를 선언하고 관리 할 수 있습니다.

 

요구사항

CentOS 7

cURL

PHP (including php-cli) 5.3.2+ 

openssl extension

 

설치

컴포져 설치는 비교적 간단합니다. 먼저 서버를 업데이트 합니다.

# sudo yum -y update

임시 폴더로 이동합니다.

# cd /tmp

cURL를 이용해서 컴포져를 설치합니다.

# sudo curl -sS https://getcomposer.org/installer | php

컴포져를 전역에서 사용할 수 있게 옮깁니다.

# mv composer.phar /usr/local/bin/composer

Path를 지정해 줍니다.

# PATH=$PATH:/usr/local/bin/

컴포져가 제대로 설치되었는지 확인합니다.

# composer -V
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Composer version 1.4.1 2017-03-10 09:29:45

위와 같이 출력되면 root 사용자가 아니면 사용할 수 없는 경우입니다.

아래와 같이 셋팅을 해줍니다.

# export COMPOSER_ALLOW_SUPERUSER=1
# composer -V
Composer version 1.4.1 2017-03-10 09:29:45

첫번째 시간에는 API 센터에서 개발자 토큰을 구하는 방법을 알아보았습니다.

두번째 시간에는 API사용을 위한 구글 인증쪽을 알아보겠습니다.

구글 API 콘솔에서 프로젝트를 하나 생성합니다.

저는 google ADS 로 만들었습니다.

그런다음 사용할 API를 선택해 주세요.

 

다음은 응용프로그램 유형을 선택해야 합니다.

구글애즈 API에는 두가지 앱 유형 옵션이 있습니다.

 - 설치된 애플리케이션(권장)

 - 웹 어플리케이션

 

유형에 따른 차이는 아래와 같습니다.

 

설치된 앱 (권장)
  • 단일 최상위 관리자 계정을 사용하여 모든 Google Ads 계정을 관리하고 있습니다.
  • 처음 사용하거나 가장 간단한 설정으로 빠르게 시작하려고합니다.
  • 앱은 여러 사용자가있는 동일한 Google Ads 계정 집합을 관리합니다.
웹 앱
  • Google Ads 계정 데이터에 액세스 할 수있는 권한을 앱에 부여 할 수있는 사용자로 인증하려고합니다.
  • 예를 들어 타사 계정을 관리하기 위해 여러 인증 자격 증명을 쉽게 생성하려고합니다.
  • 앱에 콜백 URL이 필요합니다. 콜백 URL은 설치된 앱 흐름에서 지원되지 않습니다.

앱 유형을 결정했으면 OAuth2 클라이언트 ID와 클라이언트 비밀번호를 생성합니다.

 

구글 API 콘솔 사용자 인증 정보 페이지로 갑니다.

사용자 인증정보 만들기를 클릭합니다. 팝업 메뉴중에 OAuth 클라이언트 ID 를 선택합니다.

 

선택하고 나면 동의 화면 구성을 마쳐야 한다고 나옵니다. 동의화면구성을 클릭합니다.

 

동의화면 구성을 선택하면 내부에서 사용할지 외부에서 사용할지 선택하라고 나옵니다. 보안을 위해 내부에서만 사용하게 선택합니다.

 

 

G-Suite로 로그인되어 있지 않으면 내부클릭이 되지 않습니다. 그럴때는 외부로 클릭하시면 됩니다.

 

간단하게 애플리케이션 이름만 작성하고 저장합니다. 

 

그리고나서 다시 한번 사용자 인증정보 만들기를 클릭합니다. 팝업 메뉴중에 OAuth 클라이언트 ID 를 선택합니다.

그러면 아까하고 다른 화면이 나옵니다.

동의화면이 설정되었기 때문에 정상적인 OAuth 클라이언트 ID를 만드는 화면이 나옵니다.

어플리케이션 유형은 API를 PHP기반 웹 애플리케이션을 만들려고 하시면 웹 애플리케이션을 선택합니다.

응용프로그램으로 개발하시는 분은 데스크톱 앱을 선택하시면 되겠습니다.

 

정상적으로 OAuth 클라이언트가 생성된것을 보실 수 있습니다.

이 클라이언트 ID와 비밀번호로 API에 접근하실 수 있습니다. 

'기타' 카테고리의 다른 글

Google Adsense Api 사용법(1/2)  (0) 2020.08.27
Google Ads Api 사용법(3/3)  (0) 2020.08.20
Google Ads Api 사용법(1/3)  (0) 2020.08.19

안녕하세요. 낙타입니다.

 

요즘은 네이버광고나 다음광고보다 구글광고가 대세인거 아시죠.

구글광고가 미국 플랫폼이다보니 셋팅하거나 API사용하기가 쉽지가 않습니다.

 

그러나 하나하나 따라오시면 구글 애즈 API도 쉽게 사용하실 수 있습니다.

 

제일 먼저 해야할 일은 구글 애즈 관리자 계정을 만드는 일입니다.

 

1. 구글 애즈 로그인

 

https://ads.google.com 

 

Google Ads - 손쉬운 온라인 광고로 더 많은 고객을 유치하세요

나에게 중요한 결과를 달성하세요

ads.google.com

 

2. 상단 메뉴 도구&설정을 클릭하면 그 중 계정엑세스를 클릭합니다.

 

3. 사용자탭에서 + 버튼을 클릭합니다.

 

4. 액세스 수준에서 관리를 선택하고 초대할 이메일을 작성합니다.

이메일주소는 사용자가 아닌 관리용 이메일을 작성하시면 됩니다.

초대장을 받으면 관리자계정으로 로그인을 할 수 있습니다.

만약 초대장 메일이 안오거나 셋팅이 안될때는 직접적으로 만드는 방법이 있습니다.

아래 URL로 관리자 계정 만들기를 클릭하시면 됩니다.

 

https://ads.google.com/home/tools/manager-accounts/

 

 

이렇게 관리자 계정을 만들고 나서 

다시 콘솔로 관리자계정으로 로그인합니다.

일반 ads 계정과 관리자 ads 계정을 연결하는 작업이 남았습니다.

계정메뉴를 클릭하고 + 버튼을 클릭합니다.

그러면 하위계정을 추가할 수 있는 화면이 나옵니다.

여기에 일반 ads 계정 ID (XXX-XXX-XXXX)를 입력해서 추가하고 요청보내기를 합니다.

관리자에서는 이렇게 뜨고 일반 ads로 다시 접속합니다.

도구 및 설정 메뉴에 계정 액세스 및 보안 메뉴로 들어갑니다.

관리자탭으로 가보면 관리자가 요청한 링크가 나옵니다. 거기에서 동의 버튼을 클릭하면 관리자가 API로 일반 ads 계정을 관리하실 수 있습니다.

 

관리자계정과의 연결은 이렇게 끝이 났습니다. 이제 API 센터에 가서 개발자 토큰을 구할 차례입니다.

관리자계정으로 로그인 합니다.

그리고 도구 및 설정메뉴를 클릭하면 API 센터메뉴가 보입니다.

구글애즈 API를 사용하기 위한 개발자 토큰을 여기에서 받을 수 있습니다.

API센터를 클릭하면 아래와 같은 양식이 나옵니다. 회사 정보 및 사용 목적을 입력하고 토큰생성을 클릭하면 

테스트개발용 토큰이 발급됩니다. 아직 API를 사용하지는 못하지만 토큰까지는 발급이 되는 상태입니다.

API 사용은 승인 메일을 받으신후에 사용 가능합니다.

토큰발급을 클릭하면 개발자 토큰을 보실수 있습니다. 이 값을 잘 저장해 놓으셔야 합니다.

 

 

이것으로 API 사용을 위한 첫번째 단계가 끝났습니다.

두번째는 구글 인증을 통한 클라이언트 ID생성하는 과정을 설명해 드리겠습니다.

감사합니다.

 

'기타' 카테고리의 다른 글

Google Adsense Api 사용법(1/2)  (0) 2020.08.27
Google Ads Api 사용법(3/3)  (0) 2020.08.20
Google Ads Api 사용법(2/3)  (0) 2020.08.19

안녕하세요. 낙타 2020입니다.

 

요즘 Youtube를 이용한 앱이 많이 출시되고 있습니다.

부득이하게 Youtube Api를 사용하게 되는데요.

 

워낙 오래된 구식 Api이다 보니 androidx 에 대한 지원이나 원활하게 사용하기가 쉽지 않습니다.

그래서 그걸 대체할 만한 라이브러리를 이용해서 Youtube Player를 만들어보겠습니다.

 

먼저 라이브러리를 다운받습니다.

https://github.com/PierfrancescoSoffritti/android-youtube-player

 

PierfrancescoSoffritti/android-youtube-player

YouTube Player library for Android and Chromecast, stable and customizable. - PierfrancescoSoffritti/android-youtube-player

github.com

라이브러리를 다운받으면 chromecast,core 버전으로 나누어져 있습니다. 

이걸 샘플 그대로 쓰셔도 되지만 저희 입맛에 맞게 쓸 수 있게 조금 수정해 보겠습니다.

 

프로젝트를 하나 생성합니다. Empty Activity로요.

프로젝트 생성

 

그리고 youtubetest 프로젝트로 생성합니다.

 

프로젝트를 생성하고 난후 github에서 다운받은 core와 셋팅 파일들을 붙여줍니다.

 

그리고 build.grade  프로젝트 부분에 아래 내용으로 복사해주세요.

내용은 dependencies 부분하고 kotlin 사용 라이브러리 추가가 되겠습니다.

apply from: './dependencies.gradle'

buildscript {
    apply from: './dependencies.gradle'
    repositories {
        jcenter()
        google()

    }
    dependencies {
        classpath "com.android.tools.build:gradle:${versions.gradlePlugin}"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin"
        classpath "com.novoda:bintray-release:$versions.bintrayPlugin"
    }
}

allprojects {
    repositories {
        jcenter()
        google()

    }

    tasks.withType(Javadoc).all {
        enabled = false
    }
}

app단 build.grade도 수정해 줍니다.

apply plugin: 'com.android.application'
apply from: '../dependencies.gradle'

android {
    compileSdkVersion versions.compileSdk
    buildToolsVersion versions.buildTools

    defaultConfig {
        minSdkVersion versions.minSdk
        targetSdkVersion versions.compileSdk
        versionCode versions.publishVersionCode_core
        versionName versions.publishVersion_core
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    // this is needed because I'm importing 2 modules called "core" (core and com.psoffritti.librarysampleapptemplate:core) (https://discuss.kotlinlang.org/t/disable-meta-inf-generation-in-gradle-android-project/3830)
    packagingOptions {
        exclude 'META-INF/core_release.kotlin_module'
    }
}

dependencies {
    testImplementation "junit:junit:$versions.junit"
    androidTestImplementation "androidx.test:runner:$versions.runner"
    androidTestImplementation "androidx.test.espresso:espresso-core:$versions.espressoCore"

    implementation project(':core')


    implementation "androidx.appcompat:appcompat:$versions.androidxCore"
    implementation "androidx.recyclerview:recyclerview:$versions.androidxRecyclerView"
    implementation "androidx.constraintlayout:constraintlayout:$versions.androidxConstraintLayout"
    implementation "com.google.android.material:material:$versions.androidxMaterial"

    implementation "androidx.mediarouter:mediarouter:$versions.androidxMediarouter"

    implementation "io.reactivex.rxjava2:rxjava:$versions.rxJava"
    implementation "io.reactivex.rxjava2:rxandroid:$versions.rxAndroid"

    implementation("com.google.api-client:google-api-client-android:$versions.googleApiClientAndroid") {
        exclude group: 'com.google.guava'
        exclude group: 'org.apache.httpcomponents'
        exclude group: 'com.google.code.findbugs'
        exclude group: 'com.google.http-client', module: 'google-http-client-jackson2'
    }
    implementation("com.google.apis:google-api-services-youtube:$versions.googleApiServicesYoutube") {
        exclude group: 'com.google.guava'
        exclude group: 'org.apache.httpcomponents'
        exclude group: 'com.google.code.findbugs'
        exclude group: 'com.google.http-client', module: 'google-http-client-jackson2'
    }

    implementation "com.psoffritti.librarysampleapptemplate:core:$versions.sampleAppTemplate"
}

/*
configurations {
    custom
}

dependencies {
    custom 'com.google.apis:google-api-services-youtube:v3-rev198-1.23.0'
}
*/

 

그리고 소스부분에는 github 모듈에서 utils 부분을 추가해줘야 합니다.

utils에는 FullScreenHelper와 NetworkUtils, VideosProvider, VideoInfo, YouTubeDataEndpoint 가 포함되어 있습니다.

Utils 추가

 

마지막으로 MainActivity.java 부분입니다. Listener부분과 재생관련 함수들이 포함되어 있습니다.

package com.apprichkorea.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import android.annotation.SuppressLint;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.Toast;

import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.utils.YouTubePlayerUtils;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.YouTubePlayerFullScreenListener;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.ui.PlayerUiController;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.ui.menu.MenuItem;
import com.apprichkorea.myapplication.utils.VideoIdsProvider;
import com.apprichkorea.myapplication.utils.VideoInfo;
import com.apprichkorea.myapplication.utils.FullScreenHelper;
import com.apprichkorea.myapplication.utils.YouTubeDataEndpoint;

import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;


public class MainActivity extends AppCompatActivity {

    private YouTubePlayerView youTubePlayerView;
    private FullScreenHelper fullScreenHelper = new FullScreenHelper(this);

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

        youTubePlayerView = findViewById(R.id.youtube_player_view);

        initYouTubePlayerView();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfiguration) {
        super.onConfigurationChanged(newConfiguration);
        youTubePlayerView.getPlayerUiController().getMenu().dismiss();
    }

    @Override
    public void onBackPressed() {
        if (youTubePlayerView.isFullScreen())
            youTubePlayerView.exitFullScreen();
        else
            super.onBackPressed();
    }

    private void initYouTubePlayerView() {
        initPlayerMenu();

        // The player will automatically release itself when the activity is destroyed.
        // The player will automatically pause when the activity is stopped
        // If you don't add YouTubePlayerView as a lifecycle observer, you will have to release it manually.
        getLifecycle().addObserver(youTubePlayerView);

        youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {
            @Override
            public void onReady(@NonNull YouTubePlayer youTubePlayer) {
                YouTubePlayerUtils.loadOrCueVideo(
                        youTubePlayer,
                        getLifecycle(),
                        VideoIdsProvider.getNextVideoId(),
                        0f
                );

                addFullScreenListenerToPlayer();
                setPlayNextVideoButtonClickListener(youTubePlayer);
            }
            @Override
            public void onStateChange(@NonNull YouTubePlayer youTubePlayer,@NonNull PlayerConstants.PlayerState state) {
                if(state.toString() == "ENDED") {
                    YouTubePlayerUtils.loadOrCueVideo(
                            youTubePlayer,
                            getLifecycle(),
                            VideoIdsProvider.getNextVideoId(),
                            0f
                    );

                    addFullScreenListenerToPlayer();
                    setPlayNextVideoButtonClickListener(youTubePlayer);
                }
            }
        });


    }

    /**
     * Shows the menu button in the player and adds an item to it.
     */
    private void initPlayerMenu() {
        youTubePlayerView.getPlayerUiController()
                .showMenuButton(true)
                .getMenu()
                .addItem(new MenuItem("menu item1", R.drawable.ic_android_black_24dp,
                        view -> Toast.makeText(this, "item1 clicked", Toast.LENGTH_SHORT).show())
                ).addItem(new MenuItem("menu item2", R.drawable.ic_mood_black_24dp,
                view -> Toast.makeText(this, "item2 clicked", Toast.LENGTH_SHORT).show())
        ).addItem(new MenuItem("menu item no icon",
                view -> Toast.makeText(this, "item no icon clicked", Toast.LENGTH_SHORT).show()));
    }

    private void addFullScreenListenerToPlayer() {
        youTubePlayerView.addFullScreenListener(new YouTubePlayerFullScreenListener() {
            @Override
            public void onYouTubePlayerEnterFullScreen() {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                fullScreenHelper.enterFullScreen();

                addCustomActionsToPlayer();
            }

            @Override
            public void onYouTubePlayerExitFullScreen() {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                fullScreenHelper.exitFullScreen();

                removeCustomActionsFromPlayer();
            }
        });
    }

    /**
     * This method adds a new custom action to the player.
     * Custom actions are shown next to the Play/Pause button in the middle of the player.
     */
    private void addCustomActionsToPlayer() {
        Drawable customAction1Icon = ContextCompat.getDrawable(this, R.drawable.ic_fast_rewind_white_24dp);
        Drawable customAction2Icon = ContextCompat.getDrawable(this, R.drawable.ic_fast_forward_white_24dp);
        assert customAction1Icon != null;
        assert customAction2Icon != null;

        youTubePlayerView.getPlayerUiController().setCustomAction1(customAction1Icon, view ->
                Toast.makeText(this, "custom action1 clicked", Toast.LENGTH_SHORT).show());

        youTubePlayerView.getPlayerUiController().setCustomAction2(customAction2Icon, view ->
                Toast.makeText(this, "custom action1 clicked", Toast.LENGTH_SHORT).show());
    }

    private void removeCustomActionsFromPlayer() {
        youTubePlayerView.getPlayerUiController().showCustomAction1(false);
        youTubePlayerView.getPlayerUiController().showCustomAction2(false);
    }

    /**
     * Set a click listener on the "Play next video" button
     */
    private void setPlayNextVideoButtonClickListener(final YouTubePlayer youTubePlayer) {
        Button playNextVideoButton = findViewById(R.id.next_video_button);

        playNextVideoButton.setOnClickListener(view ->
                YouTubePlayerUtils.loadOrCueVideo(
                        youTubePlayer, getLifecycle(),
                        VideoIdsProvider.getNextVideoId(),0f
                ));
       // youTubePlayer.play();
    }

    /**
     * This method is here just for reference, it is not being used because the IFrame player already shows the title of the video.
     *
     * This method is called every time a new video is being loaded/cued.
     * It uses the YouTube Data APIs to fetch the video title from the video ID.
     * The YouTube Data APIs are nothing more then a wrapper over the YouTube REST API.
     * You can learn more at the following urls:
     * https://developers.google.com/youtube/v3/docs/videos/list
     * https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.videos.list?part=snippet&id=6JYIGclVQdw&fields=items(snippet(title))&_h=9&
     *
     * This method does network operations, therefore it cannot be executed on the main thread.
     * For simplicity I have used RxJava to implement the asynchronous logic. You can use whatever you want: Threads, AsyncTask ecc.
     */
    @SuppressLint("CheckResult")
    private void setVideoTitle(PlayerUiController playerUiController, String videoId) {

        Single<VideoInfo> observable = YouTubeDataEndpoint.getVideoInfoFromYouTubeDataAPIs(videoId);

        observable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        videoInfo -> playerUiController.setVideoTitle(videoInfo.getVideoTitle()),
                        error -> { Log.e(getClass().getSimpleName(), "Can't retrieve video title, are you connected to the internet?"); }
                );
    }
}

 

위와같이 작업을 하고 실행을 시켜보면 유튜브 화면과 함께 랜덤 플레이 버튼이 나옵니다.

버튼을 클릭하면 랜덤으로 다음 유튜브 화면이 재생이 됩니다.

 

수정을 하실려면 리스너 부분이나 재생관련 부분 함수를 수정해서 쓰시면 원하시는 형태의 Youtube Player로 사용하실수 있습니다.

 

그럼 수고하세요.

+ Recent posts