質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

447閲覧

アンドロイドスタジオ 動画再生がループしてしまう

layla5252

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2022/06/21 09:47

編集2022/06/21 10:17

アンドロイドスタジオにて動画再生アプリを作成中です。
Main.Activity にてリストとチェックボックスから選択した項目により、再生する動画を変えます。
以下のコードを動作させると、チェックボックスのチェックの有無により処理を分岐する isChecked メソッド内の、if内の動画がループしてしまいます。

本来なら、isCheckd → isChecked2 → isChecked3 とチェックを進めていきたいのですが、例えばisCheckedのチェックボックスにチェックを入れると、if(isChecked)メソッド内の動画v_4がループして先に進まなくなってしまいます。

ループしないようにするアドバイスがいただけましたら幸いです。初心者のためレベルの低い質問で恐縮ですが、どうぞよろしくお願いいたします。

java
コード

package

1 2import androidx.appcompat.app.AppCompatActivity; 3 4import android.content.Intent; 5import android.media.MediaPlayer; 6import android.net.Uri; 7import android.os.Bundle; 8import android.widget.VideoView; 9 10public class TEST extends AppCompatActivity { 11 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_test); 17 18 Intent intent = getIntent(); 19 int ListTitle = intent.getIntExtra("ListTitle", 0); 20 int position = intent.getIntExtra("position",0); 21 isChecked a = new isChecked(); 22 23 switch (ListTitle) { 24 25 case 1: 26 switch (position) { 27 case 0: 28 a.start_0(); 29 a.isChecked(); 30 break; 31 case 1: 32 a.start_1(); 33 a.isChecked(); 34 break; 35 case 2: 36 a.start_2(); 37 a.isChecked(); 38 break; 39 } 40 } 41 42 private class isChecked{ 43 Intent intent = getIntent(); 44 boolean isChecked = intent.getBooleanExtra("isChecked", false); 45 boolean isChecked2 = intent.getBooleanExtra("isChecked2", false); 46 boolean isChecked3 = intent.getBooleanExtra("isChecked3", false); 47 48 VideoView v = (VideoView)findViewById(R.id.v2); 49 50 private void start_0(){ 51 v.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.v_0)); 52 v.start(); 53 } 54 55 private void start_1(){ 56 v.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.v_1)); 57 v.start(); 58 } 59 60 private void start_2(){ 61 v.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.v_2)); 62 v.start(); 63 } 64 65 66 private void isChecked() { 67 if (isChecked) { 68 v.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 69 @Override 70 public void onCompletion(MediaPlayer mp) { 71 v.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.v_4)); 72 v.start(); 73 } 74 }); 75 } 76 77 if (isChecked2) { 78 v.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 79 @Override 80 public void onCompletion(MediaPlayer mp) { 81 v.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.v_5)); 82 v.start(); 83 } 84 }); 85 } 86 87 if (isChecked3) { 88 v.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 89 @Override 90 public void onCompletion(MediaPlayer mp) { 91 v.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.v_6)); 92 v.start(); 93 } 94 }); 95 } 96 } 97 } 98}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

isChecked メソッド内の、if内の動画がループしてしまいます

MediaPlayer.OnCompletionListener の onCompletion(MediaPlayer mp) メソッドは、再生が終わったら呼ばれます。
再生が終わったら何をさせているかといえば、ビデオの URI を設定して start しているのですから、ループするのは当然ではないでしょうか。
ループさせたくないのでしたら、なぜソコに再生のコードが入っているのでしょう。


v_0 等が switch になっているということはもっと動画が多いものと思いますが、とりあえず v_0~v_2 等に特化としてコードを整理すると以下のようになりました。

※ テキトウな動画が無かったので動かしていません

playVideo メソッドにて、next が有効かどうかで onCompleteListener の登録を変えることでループを防いでいます。

java

1import androidx.annotation.*; 2import androidx.appcompat.app.AppCompatActivity; 3 4import android.content.*; 5import android.content.res.Resources; 6import android.net.Uri; 7import android.os.Bundle; 8import android.widget.VideoView; 9 10public class TEST extends AppCompatActivity { 11 static final @RawRes int[] videos = new int[]{ R.raw.v_0, R.raw.v_1, R.raw.v_2 }; 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_test); 17 18 Intent intent = getIntent(); 19 int listTitle = intent.getIntExtra("ListTitle", 0); 20 if(listTitle != 1) throw new IllegalArgumentException("ListTitle=" + listTitle); 21 int position = intent.getIntExtra("position", 0); 22 if(position < 0 || videos.length <= position) throw new IllegalArgumentException("position=" + position); 23 24 //videos の動画の再生の後に再生する動画 25 @RawRes int next = 26 intent.getBooleanExtra("isChecked", false) ? R.raw.v_4 27 : intent.getBooleanExtra("isChecked2", false) ? R.raw.v_5 28 : intent.getBooleanExtra("isChecked3", false) ? R.raw.v_6 29 : Resources.ID_NULL; 30 31 VideoView v = findViewById(R.id.v2); 32 33 playVideo(v, videos[position], next); 34 } 35 36 private void playVideo(VideoView v, @RawRes int raw, @RawRes int next) { 37 Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE).authority(getPackageName()).appendPath("" + raw).build(); 38 v.setVideoURI(uri); 39 //url の動画の後に再生が必要ならリスナを登録。不要なら null を登録(=既存を削除) 40 v.setOnCompletionListener(next == Resources.ID_NULL ? null : mp -> playVideo(v, next, Resources.ID_NULL)); 41 v.start(); 42 } 43}

投稿2022/06/21 10:34

編集2022/06/21 12:09
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

layla5252

2022/06/21 11:16

isCheckedがtrueの時だけその動画を再生したいからです。なるほど、再考いたします。わざわざご回答くださいまして、ありがとうございました。
jimbe

2022/06/21 11:58 編集

つまり、リスナが存在する限り「再生が終わったら再生」を繰り返すということです。 ですので、次に再生する動画の後はもう再生が必要無い(=最後の再生)ならリスナを削除(=nullを登録)するか、最後の再生が終わったなら次の再生は行わないようにする等の手段があります。 具体的には、 v_4~v_6の v.start() の直前に v.setOnCompletionListener(null); を入れてみては如何でしょうか。
layla5252

2022/06/21 12:26

こんなにご丁寧な回答をいただき、感謝しかありません、本当にありがとうございます! いただいたものをとにかく実践して自分のものにしていきたいと思います、本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問