Problème videoplayer app, lire toutes les videos d'un dossier en loop
Résolu/Fermé
Bonjour, je suis sur une appli de Video Player. Tout fonctionne bien mais j'aimerai faire en sorte que mes vidéos se loopent en bouclent dans un dossier. J'ai réussi à faire en sorte que la video se loop à sa fin mais je voudrais qu'elle passe à celle d'après à la fin.
Je vous mets une partie de mon code :
Je vous mets une partie de mon code :
package com.armdev.advid.activity; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.PorterDuff; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.armdev.advid.R; import com.armdev.advid.VideoModel; import com.armdev.advid.adapter.VideosAdapter; import java.util.ArrayList; import java.util.Locale; public class VideoFolder extends AppCompatActivity implements SearchView.OnQueryTextListener { private static final String MY_SORT_PREF = "sortOrder"; private RecyclerView recyclerView; private String name; private ArrayList<VideoModel> videoModelArrayList = new ArrayList<>(); private VideosAdapter videosAdapter; Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video_folder); name = getIntent().getStringExtra("folderName"); recyclerView = findViewById(R.id.video_recyclerview); toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeAsUpIndicator(getResources().getDrawable(R.drawable.back_arrow)); int index = name.lastIndexOf("/"); String onlyFolderName = name.substring(index+1); toolbar.setTitle(onlyFolderName); toolbar.setTitleTextAppearance(this, R.style.VarelaAppearance); loadVideos(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_toolbar, menu); MenuItem menuItem = menu.findItem(R.id.search); SearchView searchView = (SearchView) menuItem.getActionView(); ImageView ivClose = searchView.findViewById(androidx.appcompat.R.id.search_close_btn); ivClose.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.orange), PorterDuff.Mode.SRC_IN); searchView.setQueryHint("Rechercher un fichier"); searchView.setOnQueryTextListener(this); return super.onCreateOptionsMenu(menu); } @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { String input = newText.toLowerCase(); ArrayList<VideoModel> searchList = new ArrayList<>(); for (VideoModel model : videoModelArrayList){ if (model.getTitle().toLowerCase().contains(input)){ searchList.add(model); } } videosAdapter.updateSearchList(searchList); return false; } public void loadVideos(){ videoModelArrayList = getallVideoFromFolder(this, name); if (name!=null && videoModelArrayList.size()>0){ videosAdapter = new VideosAdapter(videoModelArrayList, this); recyclerView.setAdapter(videosAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false)); }else { Toast.makeText(this, "Aucun dossier trouvé", Toast.LENGTH_SHORT).show();; } } public ArrayList<VideoModel> getallVideoFromFolder(Context context, String name) { SharedPreferences preferences = getSharedPreferences(MY_SORT_PREF, MODE_PRIVATE); String sort = preferences.getString("sorting", "sortByDate"); String order = null; switch (sort){ case "sortByDate": order = MediaStore.MediaColumns.DATE_ADDED + " ASC"; break; case "sortByName": order = MediaStore.MediaColumns.DISPLAY_NAME + " ASC"; break; case "sortBySize": order = MediaStore.MediaColumns.DATE_ADDED + " DESC"; break; } ArrayList<VideoModel> list = new ArrayList<>(); Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; String[] projection = { MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA, MediaStore.Video.Media.TITLE, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.HEIGHT, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.BUCKET_DISPLAY_NAME, MediaStore.Video.Media.RESOLUTION }; String selection = MediaStore.Video.Media.DATA + " like?"; String[] selectionArgs = new String[]{"%" + name + "%"}; Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, order); if (cursor != null) { while (cursor.moveToNext()) { String id = cursor.getString(0); String path = cursor.getString(1); String title = cursor.getString(2); int size = cursor.getInt(3); String resolution = cursor.getString(4); int duration = cursor.getInt(5); String disName = cursor.getString(6); String bucket_display_name = cursor.getString(7); String width_height = cursor.getString(8); //this method convert 1204 in 1MB String human_can_read = null; if (size < 1024) { human_can_read = String.format(context.getString(R.string.size_in_b), (double) size); } else if (size < Math.pow(1024, 2)) { human_can_read = String.format(context.getString(R.string.size_in_kb), (double) (size / 1024)); } else if (size < Math.pow(1024, 3)) { human_can_read = String.format(context.getString(R.string.size_in_mb), size / Math.pow(1024, 2)); } else { human_can_read = String.format(context.getString(R.string.size_in_gb), size / Math.pow(1024, 3)); } //this method convert any random video duration like 1331533132 into 1:21:12 String duration_formatted; int sec = (duration / 1000) % 60; int min = (duration / (1000 * 60)) % 60; int hrs = duration / (1000 * 60 * 60); if (hrs == 0) { duration_formatted = String.valueOf(min) .concat(":".concat(String.format(Locale.FRANCE, "%02d", sec))); } else { duration_formatted = String.valueOf(hrs) .concat(":".concat(String.format(Locale.FRANCE, "%02d", min) .concat(":".concat(String.format(Locale.FRANCE, "%02d", sec))))); } VideoModel files = new VideoModel(id, path, title, human_can_read, resolution, duration_formatted, disName, width_height); if (name.endsWith(bucket_display_name)) list.add(files); } cursor.close(); } return list; } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { SharedPreferences.Editor editor = getSharedPreferences(MY_SORT_PREF, MODE_PRIVATE).edit(); switch (item.getItemId()){ case R.id.sort_dy_date: editor.putString("sorting", "sortByDate"); editor.apply(); this.recreate(); break; case R.id.sort_dy_name: editor.putString("sorting", "sortByName"); editor.apply(); this.recreate(); break; case R.id.sort_dy_size: editor.putString("sorting", "sortBySize"); editor.apply(); this.recreate(); break; case R.id.home: onBackPressed(); break; } return super.onOptionsItemSelected(item); } }
package com.armdev.advid.activity; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Point; import android.media.MediaPlayer; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.DisplayMetrics; import android.view.Display; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.GestureDetectorCompat; import com.armdev.advid.R; import static com.armdev.advid.adapter.VideosAdapter.videoFolder; public class VideoPlayer extends AppCompatActivity implements View.OnTouchListener, ScaleGestureDetector.OnScaleGestureListener, View.OnClickListener { RelativeLayout zoomLayout; ScaleGestureDetector scaleDetector; GestureDetectorCompat gestureDetector; private static final float MIN_ZOOM = 1.0f; private static final float MAX_ZOOM = 5.0f; boolean intLeft, intRight; private Display display; private Point size; int clickCount = 0; private Mode mode = Mode.NONE; private enum Mode { NONE, DRAG, ZOOM; } int device_width; private int sWidth; int screenWidth, screenHeight; private boolean isEnable = true; private boolean isOpen = true; private float scale = 1.0f; private float lastScaleFactor = 0f; // Where the finger first touches the screen private float startX = 0f; private float startY = 0f; // How much to translate the canvas private float dx = 0f; private float dy = 0f; private float prevDx = 0f; private float prevDy = 0f; android.view.ViewGroup.LayoutParams lp; int position = -1; private VideoView videoView; private VideoView videoView2; LinearLayout one, two , three , four, five, lockControls, unlockControls, rotate, etirer; ImageButton goBack, rewind, forward, playPause; TextView title, endTime, lockTextOne, lockTextTwo; SeekBar videoSeekBar; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK){ case MotionEvent.ACTION_DOWN: hideDefaultControls(); if (scale > MIN_ZOOM) { mode = Mode.DRAG; startX = event.getX() - prevDx; startY = event.getY() - prevDy; } break; case MotionEvent.ACTION_MOVE: hideDefaultControls(); isEnable = false; if (mode == Mode.DRAG) { dx = event.getX() - startX; dy = event.getY() - startY; } break; case MotionEvent.ACTION_POINTER_DOWN: mode = Mode.ZOOM; break; case MotionEvent.ACTION_POINTER_UP: mode = Mode.DRAG; break; case MotionEvent.ACTION_UP: mode = Mode.NONE; prevDx = dx; prevDy = dy; break; } scaleDetector.onTouchEvent(event); gestureDetector.onTouchEvent(event); if ((mode == Mode.DRAG && scale >= MIN_ZOOM) || mode == Mode.ZOOM) { zoomLayout.requestDisallowInterceptTouchEvent(true); float maxDx = (child().getWidth() - (child().getWidth() / scale)) / 2 * scale; float maxDy = (child().getHeight() - (child().getHeight() / scale)) / 2 * scale; dx = Math.min(Math.max(dx, -maxDx), maxDx); dy = Math.min(Math.max(dy, -maxDy), maxDy); applyScaleAndTranslation(); } return true; } private void applyScaleAndTranslation(){ child().setScaleX(scale); child().setScaleY(scale); child().setTranslationX(dx); child().setTranslationY(dy); } private View child(){ return zoomLayout(0); } private View zoomLayout(int i) { return videoView; } @Override public boolean onScale(ScaleGestureDetector detector) { float scaleFactor = scaleDetector.getScaleFactor(); if (lastScaleFactor == 0 || (Math.signum(scaleFactor) == Math.signum(lastScaleFactor))) { scale *= scaleFactor; scale = Math.max(MIN_ZOOM, Math.min(scale, MAX_ZOOM)); lastScaleFactor = scaleFactor; } else { lastScaleFactor = 0; } return true; } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video_player); /*Assigning Variables*/ videoView = findViewById(R.id.video_view); videoView2 = findViewById(R.id.video_view2); one = findViewById(R.id.videoView_one_layout); two = findViewById(R.id.videoView_two_layout); three = findViewById(R.id.videoView_three_layout); four = findViewById(R.id.videoView_four_layout); goBack = findViewById(R.id.videoView_go_back); title = findViewById(R.id.videoView_title); rewind = findViewById(R.id.videoView_rewind); playPause = findViewById(R.id.videoView_play_pause_btn); forward = findViewById(R.id.videoView_forward); endTime = findViewById(R.id.videoView_endtime); videoSeekBar = findViewById(R.id.videoView_seekbar); lockControls = findViewById(R.id.videoView_lock_screen); five = findViewById(R.id.video_five_layout); unlockControls = findViewById(R.id.video_five_child_layout); lockTextOne = findViewById(R.id.videoView_lock_text); lockTextTwo = findViewById(R.id.videoView_lock_text_two); rotate = findViewById(R.id.videoView_rotation); etirer = findViewById(R.id.videoView_track); /*Adding onClickListener*/ goBack.setOnClickListener(this); rewind.setOnClickListener(this); playPause.setOnClickListener(this); forward.setOnClickListener(this); lockControls.setOnClickListener(this); five.setOnClickListener(this); unlockControls.setOnClickListener(this); rotate.setOnClickListener(this); etirer.setOnClickListener(this); /*getting path and preparing for play video*/ position = getIntent().getIntExtra("p", -1); title.setText(videoFolder.get(position).getTitle()); String path = videoFolder.get(position).getPath(); if (path!=null){ videoView.setVideoPath(path); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){ @Override public void onPrepared(MediaPlayer mp) { videoSeekBar.setMax(videoView.getDuration()); videoView.start(); } }); }else { Toast.makeText(this, "path didn't exits", Toast.LENGTH_SHORT).show(); } /*zoom in,out and double tap to go forward,backward * and single tap to hide and show controls */ zoomLayout = findViewById(R.id.zoom_layout); display = getWindowManager().getDefaultDisplay(); size = new Point(); display.getSize(size); sWidth = size.x; DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); device_width = displayMetrics.widthPixels; zoomLayout.setOnTouchListener(this); scaleDetector = new ScaleGestureDetector(getApplicationContext(), this); gestureDetector = new GestureDetectorCompat(getApplicationContext(), new GestureDetector()); setHandler(); initalizeSeekBars(); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); android.widget.RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) videoView2.getLayoutParams(); params.width = metrics.widthPixels; params.height = metrics.heightPixels; params.leftMargin = 0; params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); videoView.setLayoutParams(params); final Handler handler = new Handler(Looper.getMainLooper()); handler.postDelayed(new Runnable(){ @Override public void run(){ hideDefaultControls(); } }, 3000); videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){ public void onCompletion(MediaPlayer mp) { videoView.start(); } }); } private void initalizeSeekBars(){ videoSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (videoSeekBar.getId() == R.id.videoView_seekbar) { if (fromUser) { videoView.seekTo(progress); videoView.start(); int currentPosition = videoView.getCurrentPosition(); endTime.setText("" + convertIntoTime(videoView.getDuration() - currentPosition)); } } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } private String convertIntoTime(int ms){ String time; int x, seconds, minutes, hours; x = ms / 1000; seconds = x % 60; x /= 60; minutes = x % 60; x /= 60; hours = x % 24; if (hours != 0) time = String.format("%02d", hours) + ":" + String.format("%02d", minutes) + ":" + String.format("%02d", seconds); else time = String.format("%02d", minutes) + ":" + String.format("%02d", seconds); return time; } private void setHandler(){ Handler handler = new Handler(); Runnable runnable = new Runnable(){ @Override public void run(){ if (videoView.getDuration()>0){ int currentPosition = videoView.getCurrentPosition(); videoSeekBar.setProgress(currentPosition); endTime.setText(""+convertIntoTime(videoView.getDuration()-currentPosition)); } handler.postDelayed(this,0); } }; handler.postDelayed(runnable,500); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.videoView_rotation: int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_PORTRAIT){ //set in landscape setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }else if (orientation == Configuration.ORIENTATION_LANDSCAPE){ //set in portrait setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } break; case R.id.videoView_lock_screen: hideDefaultControls(); five.setVisibility(View.VISIBLE); final Handler handler = new Handler(Looper.getMainLooper()); handler.postDelayed(new Runnable(){ @Override public void run(){ unlockControls.setVisibility(View.INVISIBLE); lockTextOne.setVisibility(View.INVISIBLE); lockTextTwo.setVisibility(View.INVISIBLE); } }, 3000); break; case R.id.video_five_layout: if (isOpen){ unlockControls.setVisibility(View.INVISIBLE); lockTextOne.setVisibility(View.INVISIBLE); lockTextTwo.setVisibility(View.INVISIBLE); isOpen = false; }else { unlockControls.setVisibility(View.VISIBLE); lockTextOne.setVisibility(View.VISIBLE); lockTextTwo.setVisibility(View.VISIBLE); final Handler handler2 = new Handler(Looper.getMainLooper()); handler2.postDelayed(new Runnable(){ @Override public void run(){ unlockControls.setVisibility(View.INVISIBLE); lockTextOne.setVisibility(View.INVISIBLE); lockTextTwo.setVisibility(View.INVISIBLE); isOpen = false; } }, 3000); } break; case R.id.video_five_child_layout: five.setVisibility(View.GONE); showDefaultControls(); final Handler handler2 = new Handler(Looper.getMainLooper()); handler2.postDelayed(new Runnable(){ @Override public void run(){ hideDefaultControls(); } }, 3000); break; case R.id.videoView_go_back: onBackPressed(); break; case R.id.videoView_rewind: //1000 = 1sec videoView.seekTo(videoView.getCurrentPosition() -10000); break; case R.id.videoView_forward: //1000 = 1sec videoView.seekTo(videoView.getCurrentPosition() +10000); break; case R.id.videoView_play_pause_btn: if (videoView.isPlaying()){ videoView.pause(); playPause.setImageDrawable(getResources().getDrawable(R.drawable.ic_baseline_play_arrow_24)); }else { videoView.start(); playPause.setImageDrawable(getResources().getDrawable(R.drawable.netflix_pause_button)); } break; case R.id.videoView_track: DisplayMetrics metrics1 = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics1); android.widget.RelativeLayout.LayoutParams initialParams = (android.widget.RelativeLayout.LayoutParams) videoView.getLayoutParams(); if (clickCount==1){ initialParams.alignWithParent = true; videoView.setLayoutParams(initialParams); clickCount=0; } else if (clickCount==0){ DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); android.widget.RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) videoView2.getLayoutParams(); params.width = metrics.widthPixels; params.height = metrics.heightPixels; params.leftMargin = 0; params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); videoView.setLayoutParams(params); clickCount=1; } break; } } public void getDeviceWidthAndHeight(){ lp = videoView.getLayoutParams(); screenWidth = getWindowManager().getDefaultDisplay().getWidth(); screenHeight = getWindowManager().getDefaultDisplay().getHeight(); } private class GestureDetector extends android.view.GestureDetector.SimpleOnGestureListener{ @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (isEnable){ hideDefaultControls(); isEnable = false; }else { showDefaultControls(); isEnable = true; final Handler handler = new Handler(Looper.getMainLooper()); handler.postDelayed(new Runnable(){ @Override public void run(){ hideDefaultControls(); } }, 3000); } return super.onSingleTapConfirmed(e); } @Override public boolean onDoubleTap(MotionEvent event) { if (event.getX() < (sWidth / 2)) { intLeft = true; intRight = false; videoView.seekTo(videoView.getCurrentPosition() - 20000); Toast.makeText(VideoPlayer.this, "-20sec", Toast.LENGTH_SHORT).show(); } else if (event.getX() > (sWidth / 2)) { intLeft = false; intRight = true; videoView.seekTo(videoView.getCurrentPosition() + 20000); Toast.makeText(VideoPlayer.this, "+20sec", Toast.LENGTH_SHORT).show(); } return super.onDoubleTap(event); } } private void hideDefaultControls(){ one.setVisibility(View.GONE); two.setVisibility(View.GONE); three.setVisibility(View.GONE); four.setVisibility(View.GONE); //Todo this function will hide status and navigation when we click on screen final Window window = this.getWindow(); if (window == null){ return; } window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); final View decorView = window.getDecorView(); if (decorView!=null){ int uiOption = decorView.getSystemUiVisibility(); if (Build.VERSION.SDK_INT >= 14) { uiOption |= View.SYSTEM_UI_FLAG_LOW_PROFILE; } if (Build.VERSION.SDK_INT >= 16) { uiOption |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } if (Build.VERSION.SDK_INT >= 19) { uiOption |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } decorView.setSystemUiVisibility(uiOption); } } private void showDefaultControls(){ one.setVisibility(View.VISIBLE); two.setVisibility(View.VISIBLE); three.setVisibility(View.VISIBLE); four.setVisibility(View.VISIBLE); //todo this function will show status and navigation when we click on screen final Window window = this.getWindow(); if (window == null){ return; } window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); final View decorView = window.getDecorView(); if (decorView!=null){ int uiOption = decorView.getSystemUiVisibility(); if (Build.VERSION.SDK_INT >= 14) { uiOption &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; } if (Build.VERSION.SDK_INT >= 16) { uiOption &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } if (Build.VERSION.SDK_INT >= 19) { uiOption &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } decorView.setSystemUiVisibility(uiOption); } } @Override public void onBackPressed(){ super.onBackPressed(); } }
Configuration: Windows / Chrome 91.0.4472.164
A voir également:
- Problème videoplayer app, lire toutes les videos d'un dossier en loop
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- App data - Guide
- Lire un fichier epub - Guide
- Mettre un mot de passe sur un dossier - Guide
- Lire fichier bin - Guide
1 réponse
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
21 juil. 2021 à 11:45
21 juil. 2021 à 11:45
Hello,
Quel est le problème exactement ? Il te suffit juste de reinitialiser ton player avec ta nouvelle video à la fin de chaque lecture, non ?
Quel est le problème exactement ? Il te suffit juste de reinitialiser ton player avec ta nouvelle video à la fin de chaque lecture, non ?
23 juil. 2021 à 14:38
je ne sais pas trop comment mais j'ai réussi hehe
Merci de ton aide !
Voila mon code pour les curieux