[JAVA] Obtenez des informations vidéo YouTube avec Retrofit et conservez-les dans l'application Android.

Dans cet article, nous allons faire trois choses principales.

  1. [Enregistrez votre application dans la liste lorsque vous "partagez" depuis Youtube. ](# -1-Enregistrez votre application dans la liste lors du partage depuis youtube)
  2. [Obtenez un identifiant à partir des informations de lien lors du "partage", et obtenez des informations vidéo Youtube à partir de cet identifiant. ](# -2-Obtenez l'identifiant à partir des informations du lien lors du partage et obtenez les informations vidéo de youtube à partir de cet identifiant)
  3. [Accédez à l'API avec Retrofit & Gson. Les informations vidéo sont affichées sur l'application d'acquisition. ](# -3-retrofit - Accéder à l'API avec gson Obtenir des informations vidéo sur l'application-)

Le code est ici. SharedText

1. Enregistrez votre application dans la liste lors du "partage" depuis Youtube.

Tout d'abord, ajoutez un filtre d'intention à Manifest.xml.

AndroidManifest.xml


// ...Omission...
  <activity android:name=".SharedActivity">
      <intent-filter>
          <action android:name="android.intent.action.SEND" />
          <category android:name="android.intent.category.DEFAULT" />
          <data android:mimeType="text/plain"/>
      </intent-filter>
  </activity>
// ...Omission...

Ensuite, essayez de le recevoir avec SharedActivity.java.

SharedActivity.java


public class SharedActivity extends AppCompatActivity {

    TextView textView;
    ImageView thumbnail;

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

        textView = findViewById(R.id.movieId);
        thumbnail = findViewById(R.id.thumbnail);

        Intent intent = getIntent();
        String id = null;

        if(intent.getType().equals("text/plain")){
            String text = intent.getStringExtra(Intent.EXTRA_TEXT);
            Log.d("text",text);
        }
    }
// ...Omission...
}

Vous pouvez maintenant recevoir le lien qui a été transmis au texte par intention.

[référence]

2. Obtenir l'identifiant à partir des informations du lien lors du "partage" et son Obtenez des informations vidéo Youtube à partir de l'ID.

Comment obtenir une pièce d'identité

Cela extrait docilement l'ID de la chaîne de lien. https://youtu.be/yT_ylSCgY6Q Puisque vous pouvez obtenir la chaîne de caractères comme celle-ci, le «yT_ylSCgY6Q» de fin est l'ID de la vidéo.

Au fait, le lien ci-dessus vous mènera à BUMP OF CHICKEN feat. HATSUNE MIKU "ray".

Obtenez des informations vidéo Youtube.

Pour obtenir des informations sur les vidéos YouTube, comme l'article Obtenir des informations sur les vidéos YouTube à l'aide de Data API v3, ** L'API de données Youtube ** est utilisée. Obtenez la clé API et entrez l'URL suivante dans votre navigateur. Pour plus d'informations sur l'acquisition de la clé API, reportez-vous à Obtention d'informations vidéo YouTube à l'aide de Data API v3.

https://www.googleapis.com/youtube/v3/videos?id=yT_ylSCgY6Q&key=【API Key】&fields=items(id,snippet(channelTitle,title,thumbnails),statistics)&part=snippet,contentDetails,statistics

Entrez la clé acquise dans la partie [Clé API].

Le résultat est le suivant.

result


{
 "items": [
  {
   "id": "yT_ylSCgY6Q",
   "snippet": {
    "title": "BUMP OF CHICKEN feat. HATSUNE MIKU「ray」",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/yT_ylSCgY6Q/default.jpg ",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/yT_ylSCgY6Q/mqdefault.jpg ",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/yT_ylSCgY6Q/hqdefault.jpg ",
      "width": 480,
      "height": 360
     },
     "standard": {
      "url": "https://i.ytimg.com/vi/yT_ylSCgY6Q/sddefault.jpg ",
      "width": 640,
      "height": 480
     },
     "maxres": {
      "url": "https://i.ytimg.com/vi/yT_ylSCgY6Q/maxresdefault.jpg ",
      "width": 1280,
      "height": 720
     }
    },
    "channelTitle": "BUMP OF CHICKEN"
   },
   "statistics": {
    "viewCount": "12691874",
    "likeCount": "65136",
    "dislikeCount": "3062",
    "favoriteCount": "0",
    "commentCount": "4337"
   }
  }
 ]
}

[référence]

3. Accéder à l'API avec Retrofit & Gson. Les informations vidéo sont affichées sur l'application d'acquisition.

Aperçu

introduction

dependencies {
    // ...Omission...
    implementation 'com.google.code.gson:gson:2.8.4'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    // ...Omission...
}

[référence]

Implémentation de l'interface API

ApiService.java


public interface ApiService {
    @Headers("Accept-Language: ja")
    @GET("/youtube/v3/videos?")
    Call<APIResponse> requestMovie(@Query("id") String id,
                                    @Query("key") String key,
                                    @Query("fields") String fields,
                                    @Query("part") String part);
}

Définir une classe qui stocke les données obtenues à partir de l'API en tant qu'objet Java

APIResponse.java


public class APIResponse {

    public List<Item> items;

    public List<Item> getItems() {
        return items;
    }
}

Item.java


public class Item {

    @SerializedName("id")
    private String id;

    @SerializedName("snippet")
    private Snippet snippet;

    @SerializedName("statistics")
    private Statistics statistics;

    public String getId() {
        return id;
    }

    public Snippet getSnippet() {
        return snippet;
    }

    public Statistics getStatistics() {
        return statistics;
    }
}

Snippet.java


public class Snippet {

    @SerializedName("title")
    private String title;

    @SerializedName("thumbnails")
    private Thumbnails thumbnails;

    public class Thumbnails {

        @SerializedName("default")
        public Default aDefault;

        @SerializedName("medium")
        public Medium medium;

        @SerializedName("high")
        public High high;

        public High getHigh() {
            return high;
        }

        @SerializedName("standard")
        public Standard standard;

        @SerializedName("maxres")
        public Maxres maxres;


        public class Default {
            String url;
            String width;
            String height;
        }

        public class Medium {
            String url;
            String width;
            String height;

        }

        public class High {
            String url;
            String width;
            String height;

            public String getUrl() {
                return url;
            }
        }

        public class Standard {
            String url;
            String width;
            String height;
        }

        public class Maxres {
            String url;
            String width;
            String height;
        }

    }

    @SerializedName("channelTitle")
    String channelTitle;

    public String getTitle() {
        return title;
    }

    public Thumbnails getThumbnails() {
        return thumbnails;
    }

    public String getChannelTitle() {
        return channelTitle;
    }
}

Statistics.java


public class Statistics {

    @SerializedName("viewCount")
    String viewCount;

    @SerializedName("likeCount")
    String likeCount;

    @SerializedName("dislikeCount")
    String dislikeCount;

    @SerializedName("favoriteCount")
    String favoriteCount;

    @SerializedName("commentCount")
    String commentCount;


    public String getViewCount() {
        return viewCount;
    }

    public String getLikeCount() {
        return likeCount;
    }

    public String getDislikeCount() {
        return dislikeCount;
    }

    public String getFavoriteCount() {
        return favoriteCount;
    }

    public String getCommentCount() {
        return commentCount;
    }
}

Pendant que j'écrivais l'article, j'ai remarqué que je l'avais écrit sans trop penser aux modificateurs, donc je vous serais reconnaissant si vous pouviez faire quelque chose.

Mise en œuvre du traitement pour accéder à l'API YouTube Data v3 et acquérir des informations vidéo

MainActivity.java


public class MainActivity extends AppCompatActivity {

    private Retrofit mRetrofit;
    private ApiService mService;

    //CLÉ API créée à partir de la console
    private final String API_KEY = "dummyAPIKey"; //Veuillez modifier la clé API le cas échéant.
    private final String FIELDS = "items(id,snippet(channelTitle,title,thumbnails),statistics)";
    private final String PART = "snippet,contentDetails,statistics";

    // "BUMP OF CHICKEN feat. HATSUNE MIKU「ray」"
    private String testId = "yT_ylSCgY6Q";

    ImageView picture;
    TextView title;
    Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRetrofit = new Retrofit.Builder()
                .baseUrl("https://www.googleapis.com")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        mService = mRetrofit.create(ApiService.class);

        picture = findViewById(R.id.picture);
        title = findViewById(R.id.title);
        button = findViewById(R.id.button);
        button.setOnClickListener(onClickListener);
    }
    
    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Call<APIResponse> mCall = mService.requestMovie(testId,API_KEY,FIELDS,PART);

            mCall.enqueue(new Callback<APIResponse>() {
                @Override
                public void onResponse(Call<APIResponse> call, Response<APIResponse> response) {

                    //Obtenir l'élément de la réponse
                    List<Item> items = response.body().getItems();

                    for(Item item : items){

                        Uri uri = Uri.parse(item.getSnippet().getThumbnails().getHigh().getUrl());
                        Uri.Builder builder = uri.buildUpon();
                        AsyncTaskHttpRequest task = new AsyncTaskHttpRequest(picture);
                        task.execute(builder);
                        
                        title.setText(item.getSnippet().getTitle());
                    }
                }

                @Override
                public void onFailure(Call<APIResponse> call, Throwable t) {

                }
            });

        }
    };
    

}

De plus, j'ai fait référence au site suivant pour obtenir l'image à partir de l'URL et l'afficher dans ImageView. Notez que même si vous copiez et collez le code ci-dessus, la classe AsyncTaskHttpRequest ne sera pas définie. [référence]

Implémentation du fichier de mise en page

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@+id/title"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title"
        app:layout_constraintVertical_bias="0.3" />

</android.support.constraint.ConstraintLayout>

activity.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".SharedActivity">

    <ImageView
        android:id="@+id/thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:padding="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.201"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/movieId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

AndroidManifest.xml Au cas où, je publierai également le fichier manifeste.

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tomiyama.noir.sharedtext">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SharedActivity">

            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain"/>

            </intent-filter>
        </activity>
    </application>

</manifest>

[référence] Cela a été très utile lors de l'accès à l'API autour de Retrofit. Aussi, pour plus de détails, reportez-vous au code affiché sur Github.

Recommended Posts

Obtenez des informations vidéo YouTube avec Retrofit et conservez-les dans l'application Android.
Obtenez votre numéro de version dans l'application Android
[Développement Android] Obtenez des images du serveur avec Java et définissez-les dans ImageView! !!
Obtenez des informations vidéo de Nikorepo et envoyez-les à Slack
Obtenez des informations sur la chaîne Youtube avec l'application Rails (en utilisant Yt gem)
[Rails] Obtenez access_token au moment de l'authentification Twitter avec Sorcery et enregistrez-le dans la base de données
Représentez graphiquement les informations du capteur de Raspberry Pi en Java et vérifiez-les avec un navigateur Web
Ajoutez une bibliothèque jar pré-construite à Android et appelez-la dans le cadre
[Rails] Comment obtenir les informations sur l'utilisateur actuellement connecté avec devise
Est-il possible de mettre la bibliothèque (aar) dans la bibliothèque Android (aar) et de l'utiliser?
L'application Android plante. Cliquez simplement sur un bouton et il tombera.
Je crée une application Android et elle est bloquée par des erreurs et comment la résoudre
[Android] Histoire désespérée avec UserId et SharedUserId de l'application
J'ai essayé d'appeler une vidéo YouTube de DB avec haml et de l'afficher intégrée
Faire vibrer le bracelet avec Bluetooth à partir de l'application Android
Mise en œuvre du menu déroulant dans l'application d'origine avec Active Hash
Obtenez des informations de localisation avec Rails et triez par ordre croissant
Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)
Jusqu'à ce que vous construisiez un projet écrit scala avec Maven et que vous l'exécutiez avec la commande scala.
Obtenir des informations de localisation Android
Application Android qui sélectionne et affiche des images de la galerie
Comment obtenir des valeurs en temps réel avec TextWatcher (Android)
Obtenir des informations dans une instance et calculer des nombres Version standard
Dans Redmine, vous pouvez obtenir le projet avec Project.find (<identifier>)
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
Elasticsearch> Construisez avec docker, obtenez des informations Twitter et visualisez avec Kibana
Si cela ne change pas avec l'option disable_with dans Safari
[Android] Modifiez le nom de l'application et l'icône de l'application pour chaque saveur
La différence entre la programmation qui utilise des classes Ruby et la programmation qui n'utilise pas
Causes techniques et contre-mesures pour les points auxquels j'étais accro avec la première application Android et Kotlin
[Pour les super débutants] Les connaissances minimales que vous voulez garder à l'esprit avec les hachages et les symboles
Générez un numéro de série avec TableGenerator of Hibernate (JPA) et stockez-le dans l'ID de String.