الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف اعرض وقت Media Player في TextView

بدأه Al-Mansour في 1 يناير 2014 · 7 رد · 904 مشاهدة · في Android
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم 

 

لي ثلاثة ايام ابحث عن الحل في قوقل ولم اجد بحكم قلة الخبرة والمعرفة في البرمجة 

 

هذا الكود لتشغيل الصوت

واتمنى مساعدتي في فهم عرض وقت الصوت والمنقضى منه

 

tv1 لبداية الوقت و tv2 لنقص الوقت كما يأتي في مشغلات الصوت

package com.example.timers_1;



import java.io.File;

import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener, OnCompletionListener, OnBufferingUpdateListener ,OnTouchListener, OnSeekBarChangeListener {
	private MediaPlayer mediaPlayer;
	TextView tv1,tv2;
	Button bt1,bt2,bt3,stopBtn;
	SeekBar seekBarProgress;
	 Thread  thread;

	 int position = 0;
	 private Handler mHandler = new Handler();
	 
	 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		bt1 = (Button) findViewById(R.id.But1);
		bt2 = (Button) findViewById(R.id.But2);
		bt3 = (Button) findViewById(R.id.But3);
		stopBtn = (Button) findViewById(R.id.stopBtm);
		
		tv1 = (TextView) findViewById(R.id.numLeftText);
		tv1.setOnTouchListener(this);
		
		tv2 = (TextView) findViewById(R.id.numRightText);
		tv2.setOnTouchListener(this);
		
		
		bt1.setOnClickListener(this);
		bt2.setOnClickListener(this);
		bt3.setOnClickListener(this);
		stopBtn.setOnClickListener(this);
		
		seekBarProgress = (SeekBar)findViewById(R.id.seekBar1);  
		seekBarProgress.setOnTouchListener(this);
	     
	       
		 mediaPlayer = new MediaPlayer();
	     mediaPlayer.setOnBufferingUpdateListener(this);
	     mediaPlayer.setOnCompletionListener(this);
	 	 
		
	}
	@Override
	public void onClick(View v) {
		
		if(v == findViewById(R.id.But1)){
			
			 try
	            {	
				mediaPlayer.reset();
	      		mediaPlayer.setDataSource("/sdcard/001.mp3");
	      		mediaPlayer.prepare();
	      		mediaPlayer.start();
	    		mediaPlayer.setOnPreparedListener(new OnPreparedListener() 
			    {
			      @Override
			      public void onPrepared(final MediaPlayer mp) 
			      {
			    	  seekBarProgress.setMax(mediaPlayer.getDuration());
			          thread=  new Thread(new Runnable() {
			        	 
			        @Override
			        public void run() {
			        if(!Thread.interrupted()){
			              try{           	 
			                while(mediaPlayer!=null && mediaPlayer.isPlaying())
			                { 
			                seekBarProgress.setProgress(mediaPlayer.getCurrentPosition());
			                try {
			                      Thread.sleep(1000);
			                 } 
			                catch (InterruptedException e) {
			                 e.printStackTrace();
			                  } mHandler.post(new Runnable() {
												
			                @Override
							public void run() {
	
						}
					});
			    }
			 }
			                   catch (IllegalStateException e) {		                                
			     }
			                     }
			                     }
			             });
			           thread.start();
			      }
			  });
  
	             }
	            catch(Exception e)
	            {
	                e.printStackTrace();
	            }
	
		}else if (v== findViewById(R.id.stopBtm)){
			Toast.makeText(this, "stopBtm", Toast.LENGTH_LONG).show();
			mediaPlayer.reset();
			seekBarProgress.setMax(0);
		}

		mediaPlayer.setOnSeekCompleteListener(new OnSeekCompleteListener() {
			@Override
			public void onSeekComplete(MediaPlayer mp) {
				
		  
		}
		});
		
		
	}
	
	
	@Override
	public void onBufferingUpdate(MediaPlayer arg0, int percant) {
	
	}
	

	@Override
	public void onCompletion(MediaPlayer mp) {
		// TODO Auto-generated method stub
		//mediaPlayer.start();
		 mediaPlayer.seekTo(position);
		 seekBarProgress.setMax(0);
		
	}
	@Override
	public boolean onTouch(View v, MotionEvent me) {
		// TODO Auto-generated method stub
	

           return false;
	
	
	}

	public void onStop() {
	    super.onStop();
	    // Log.v("CustomAudioPlayer","onStop Called");
	    mediaPlayer.stop();
	    mediaPlayer.release();
	  }
	
	
	 
	@Override
	public void onStartTrackingTouch(SeekBar arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser) {
		// TODO Auto-generated method stub
		
	}


	
}

تم تعديل هذه المشاركة بواسطة Al-Mansour في 1 يناير 2014 في 16:38

#2

السلام عليكم ورحمة الله 

إليك أخي العزيز  نشاط (Activity)  يحل هذه المشكلة و يستعرض وقت  المدة الزمنية  لملف  مرئي أو صوتي  ...

/*
 * @author issamux
 */

package com.issamux;

import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity2 extends Activity implements OnClickListener,
		MediaPlayer.OnPreparedListener {

	private MediaPlayer mediaPlayer;
	private TextView totalDuration, durationCounter;
	private Button startBtn, pauseBtn, stopBtn;
	private SeekBar seekBarProgress;
	private Context context;
	private boolean isPaused;

	private ProgressAsyncTask progressTask;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main_2);
		context = this;
		initMediaPlayer();
		initUI();
	}

	private void initMediaPlayer() {
		mediaPlayer = new MediaPlayer();
	}

	private void initUI() {
		startBtn = (Button) findViewById(R.id.play_button);
		pauseBtn = (Button) findViewById(R.id.pause_button);
		stopBtn = (Button) findViewById(R.id.stopBtm);
		totalDuration = (TextView) findViewById(R.id.totalDuration);
		durationCounter = (TextView) findViewById(R.id.durationCounter);
		seekBarProgress = (SeekBar) findViewById(R.id.seekBar1);
		// set listener
		totalDuration.setOnClickListener(this);
		durationCounter.setOnClickListener(this);
		startBtn.setOnClickListener(this);
		pauseBtn.setOnClickListener(this);
		stopBtn.setOnClickListener(this);
		seekBarProgress.setOnClickListener(this);

	}

	private void prepareMPlayer() {
		mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
		mediaPlayer.setOnPreparedListener(this);
		try {
			mediaPlayer.prepare();
		} catch (IllegalStateException e) {
			Log.i("Main", "IllegalStateException: " + e.getMessage());
		} catch (IOException e) {
			Log.i("Main", "IOException: " + e.getMessage());
		}
	}

	public void stopMusic() {
		mediaPlayer.release();
		mediaPlayer = null;
		progressTask.cancel(true);
		progressTask = null;
	}

	private void resumePlay() {
		mediaPlayer.start();
		isPaused = false;
		progressTask.resume();

	}

	private void pausePlay() {
		isPaused = true;
		mediaPlayer.pause();
		progressTask.suspend();

	}

	private String getTimeString(long millis) {
		StringBuffer buf = new StringBuffer();

		int hours = (int) (millis / (1000 * 60 * 60));
		int minutes = (int) ((millis % (1000 * 60 * 60)) / (1000 * 60));
		int seconds = (int) (((millis % (1000 * 60 * 60)) % (1000 * 60)) / 1000);

		buf.append(String.format("%02d", hours)).append(":").append(String.format("%02d", minutes))
				.append(":").append(String.format("%02d", seconds));

		return buf.toString();
	}

	@Override
	public void onClick(View v) {

		if (v.getId() == R.id.play_button) {
			if (mediaPlayer.isPlaying())
				return;
			prepareMPlayer();
		}
		else if (v.getId() == R.id.stopBtm) {
			Toast.makeText(this, "stopBtm", Toast.LENGTH_LONG).show();
			mediaPlayer.reset();
			seekBarProgress.setMax(0);
		}
		else {
			if (v.getId() == R.id.pause_button) {

				if (isPaused) {
					resumePlay();
					((TextView) v).setText("pause");
				}
				else {
					((TextView) v).setText("resume");
					pausePlay();
				}

			}
		}

	}

	@Override
	public void onPrepared(MediaPlayer mp) {
		mediaPlayer.start();
		totalDuration.setText(getTimeString(mediaPlayer.getDuration()));
		progressTask = new ProgressAsyncTask();
		progressTask.execute();

	}

	class ProgressAsyncTask extends AsyncTask<Void, Integer, Void> {

		boolean isSuspended;

		public ProgressAsyncTask() {
			isSuspended = false;
		}

		void suspend() {
			isSuspended = true;
		}

		synchronized void resume() {
			isSuspended = false;
			notify();
		}

		@Override
		protected Void doInBackground(Void... params) {
			seekBarProgress.setMax(mediaPlayer.getDuration());
			while (mediaPlayer != null && mediaPlayer.isPlaying()) {
				seekBarProgress.setProgress(mediaPlayer.getCurrentPosition());
				// publish media player progress
				publishProgress(mediaPlayer.getCurrentPosition());
				// case we pause thread
				synchronized (this) {
					while (isSuspended) {
						try {
							wait();
						} catch (InterruptedException e) {
							Log.i("MyThread", "InterruptedException" + e.getMessage());
						}
					}
				}
			}

			return null;
		}

		@Override
		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
		}

		@Override
		protected void onProgressUpdate(Integer... progress) {
			// update UI
			durationCounter.setText(getTimeString(progress[0]));
		}

	}

}

و واجهة المستخدم  (UI) 

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/play_button"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="52dp"
        android:text="Play" />

    <Button
        android:id="@+id/pause_button"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/play_button"
        android:layout_toRightOf="@+id/play_button"
        android:text="Pause" />

    <Button
        android:id="@+id/stopBtm"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/pause_button"
        android:layout_toRightOf="@+id/pause_button"
        android:text="Stop" />

    <SeekBar
        android:id="@+id/seekBar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

    <TextView
        android:id="@+id/totalDuration"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/play_button"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="44dp"
        android:layout_marginLeft="24dp"
        android:text="TextView" />

    <TextView
        android:id="@+id/durationCounter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/totalDuration"
        android:layout_alignBottom="@+id/totalDuration"
        android:layout_marginLeft="18dp"
        android:layout_toRightOf="@+id/stopBtm"
        android:text="TextView" />

</RelativeLayout>

البرنامج بأكمله على github ... 

 

 

https://github.com/issamux/MediaPlayerandServiceDemo.git

1

لا إله إلا الله محمد رسول الله  

Blog

GitHub

#3

بارك الله فيك اخي الغالي 

 

اشكرك سوف اراجع الكود واريد منك فيما بعد بعض التوضيح لوظائف الكود حتى افهمه واستفيد 

تم تعديل هذه المشاركة بواسطة Al-Mansour في 3 يناير 2014 في 08:20

#4

ملخص لأهم النقاط التي يجب معرفتها عند إستعمال قارئ الملتيميديا في جهاز الروبوت الأخضر ...


  1. يتم تشغيل ملفات الصوت / الفيديو و التيارات المتدفقة (STREAMS ) والتعامل معها بوصفها آلة ذات حالات (state machine).http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram
  2.  

التنقل بين هاته الحالات أو الأوضاع قد يكون غير متزامن ، يعني قد يستغرق بعد الثواني .... لذا عند تشغيل قارئ الملتيميديا ، أقوم مسبقاً بتسجيل النشاط (ACTIVITY) لكي ينصت إلى حدث : 


MediaPlayer.OnPreparedListener .... وبالتالي أعرف تماماً متى يكون الميديا جاهز للاستعمال ....  


ثاني شيء نحن في حاجة إلى Thread لكي يقوم بتحديث شيئين : ال-SeekBar والمدة الزمنية الملعوبة ... و يجب أن يوفر هذا ال-thread إمكانية توقيفه (Pause) وإعادة تشغيله (Resume) ... بجافا تقليدية سوف نستخدم  Thread wait و-interrupt إلخ إلخ لكن عندما نريد تحديث واجهة المستخدم سوف نواجه مشكل : فقط ال-Thread الذي قام بإنشاء الواجهة يمكنه إستخدام وتحديثها وليس من thread مغاير ... وهنا سوف نقوم بإستعمال : runOnUI أو  handler لربط ال-Thread مع UIThread .... لكن لماذا عدم إستخدام AsyncTask ، علماً أن دالته : onProgressUpdate  تقوم بتحديث وإستعمال ال-UIThread بكل سهولة ...


 


الكود ليس مثالي 100% ،، ويمكن عمل نفس الشيء بطرق مختلفة :) 

1

لا إله إلا الله محمد رسول الله  

Blog

GitHub

#5

بارك الله فيك :)

#6

هناك مشكلة لم استطع حلها عندما اريد إيقاف الصوت pause يقف الوقت وشريط seekbar والصوت 100% 

 

المشكلة لما اريد استكمال الصوت Start يعمل الصوت ولكن الوقت وشريط seekbar لا يعمل واقف !!

 

حاولت اتحكم بهما من isSuspended = false و isSuspended = true  فلم استطع :)

#7

أخي الغالي ....البرنامج شغال :) 100%  ?????


 


PLAY -> PAUSE -> resume .... 


PLAY -> STOP -> PLAY 


 


في كل الحالات seekbar والوقت شغالين 


لا إله إلا الله محمد رسول الله  

Blog

GitHub

#8

شكرا لك اخي الكريم :)

مواضيع مشابهة