2012-02-28 18 views
20

मेरे पास SeekBar है, यह MediaPlayer प्रगति को सही ढंग से प्रदर्शित करता है। हालांकि, मुझे तलाशने में परेशानी है - अगर मैं कहीं स्क्रॉल बॉक्स की तलाश करता हूं तो यह उस स्थिति पर वापस आ जाता है जहां ऑडियो फाइल चल रही है।एंड्रॉइड सीकबार मीडियाप्लेयर प्रगति को नियंत्रित करने के लिए

public class EntityPageActivity extends Activity implements Runnable, OnClickListener, OnSeekBarChangeListener{ 
    private SeekBar seekBar; 
    private Button startMedia; 
    private Button pauseMedia; 
    private MediaPlayer mp; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.entity_page);    

     AudioControl();   

    } 

    public void AudioControl(){ 
     seekBar = (SeekBar) findViewById(R.id.seekBar); 
     startMedia = (Button) findViewById(R.id.play); 
     pauseMedia = (Button) findViewById(R.id.pause); 
     startMedia.setOnClickListener(this); 
     pauseMedia.setOnClickListener(this); 
    } 

    public void run() { 
     int currentPosition= 0; 
     int total = mp.getDuration(); 
     while (mp!=null && currentPosition<total) { 
      try { 
       Thread.sleep(1000); 
       currentPosition= mp.getCurrentPosition(); 
      } catch (InterruptedException e) { 
       return; 
      } catch (Exception e) { 
       return; 
      }    
      seekBar.setProgress(currentPosition); 
     } 
    } 

    public void onClick(View v) { 
     if (v.equals(startMedia)) { 
      if (mp != null && mp.isPlaying()) return; 
      if(seekBar.getProgress() > 0) { 
       mp.start(); 
       return; 
      } 
      mp = MediaPlayer.create(EntityPageActivity.this, R.raw.gl1); 
      mp.start();      
      seekBar.setProgress(0); 
      seekBar.setMax(mp.getDuration()); 
      new Thread(this).start(); 
     } 

     if (v.equals(pauseMedia) && mp!=null) { 
      mp.pause(); 
     }  

    } 

    public void onStartTrackingTouch(SeekBar seekBar) { 
    } 

    public void onStopTrackingTouch(SeekBar seekBar) { 
    } 

    public void onProgressChanged(SeekBar seekBar, int progress, 
      boolean fromUser) { 
     if(fromUser) mp.seekTo(progress); 

    } 
} 

इस प्रकार, onProgressChangedSeekBarMediaPlayer नियंत्रित करने के लिए अनुमति देने के लिए पर्याप्त नहीं है?

मुझे अनुमति देने के लिए मुझे क्या जोड़ना/सही करना चाहिए?

धन्यवाद

अद्यतन

मुझे पता चला कि onProgressChanged किसी कारण द्वारा लाया कभी नहीं किया गया है। हालांकि मैं समझ नहीं क्यों

+0

@llya मेरे पास मीडिया प्लेयर है लेकिन वीडियो और वर्क्स ठीक के साथ इसका खेल मैं आपकी मदद कर सकता हूं? –

+0

मुझे लगता है कि आप बेहतर जानते हैं कि आप मदद कर सकते हैं या नहीं) यदि आपको लगता है कि आप समस्या का निर्णय कैसे लेते हैं तो जवाब देने का प्रयास करें –

+0

मेरा उत्तर देखें .............. –

उत्तर

10

समस्या seekBar.setOnSeekBarChangeListener(this); तो आपका AudioControl() विधि ..... आप अपने seekbar को oncheckchangedlistner सेट न में रख है। ...

+0

बिल्कुल मदद नहीं करता! ऐसा लगता है जैसे मैं इसे भूल गया था। धन्यवाद –

6

निम्न कोड के साथ प्रयास करें:

public void onProgressChanged(SeekBar seekBar, int progress, 
      boolean fromUser) { 
     if(fromUser){ 
     mp.seekTo(progress); 
     seekbar.setProgress(progress);} 
} 
+0

'मीडियाप्लेयर'' सेट प्रोग्रेस 'विधि नहीं है –

+0

seekbar.set प्रगति (प्रगति); – jyotiprakash

+0

दुर्भाग्य से यह –

5

आपको onCreate के अंदर तलाशने की विधियां शामिल करनी होंगी। मुझे एक ही समस्या थी, और इसके बाद यह काम किया।

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
if(fromUser){ 
    mediaPlayer.seekTo(progress); 
    seekBar.setProgress(progress); 
} 
0

OnCreate() विधि में इस कोड की कोशिश करो और परियोजना चलाने उम्मीद है कि इस काम कर रहा है।

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
      mediaPlayer.seekTo(i); 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }); 
0

मैं चाल करने के लिए इस सरल कोड का उपयोग कर रहा हूं।

package in.bhartisoftwares.amit.allamitapps; 

import android.content.Context; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.SeekBar; 
import android.widget.Toast; 

import java.util.Timer; 
import java.util.TimerTask; 

public class audioControllerTwo extends AppCompatActivity { 
    MediaPlayer mPlayer;   
    SeekBar audioTraverse; 

यहां मैंने सार्वजनिक कक्षा में मेरा सेकरबार और मीडियाप्लेयर परिभाषित किया है।

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

    mPlayer = MediaPlayer.create(this, R.raw.song); 

यहाँ मैं MPlayer चर, कि मेरे ऑडियो "गीत" जो "कच्चे" फ़ोल्डर में मौजूद है कहा जाता है फ़ाइल पाता बनाने हूँ: फिर OnCreate विधि पर मैं इस तरह कोड है।

तब मैं अपने seekbar "audioTraverse" कहा जाता है को पकड़ा और उसके असाइन करने के लिए "audioTraverse" चर और हथियाने ऑडियो फ़ाइल के "अवधि" और मेरे "audioTraverse" करने के लिए है कि अवधि बताए seekbar इस प्रकार है:

audioTraverse = (SeekBar) findViewById(R.id.audioTraverse); 
    audioTraverse.setMax(mPlayer.getDuration()); 

अब मैं एक टाइमर चला रहा हूं जो हर सेकेंड के बाद दौड़ जाएगा और यह तदनुसार सेकरबार की स्थिति को अपडेट करेगा। इस seekbar पर और "OnProgressChange()" में किसी भी बदलाव के लिए दिखेगा विधि मैं उपयोग कर रहा हूँ ".seekTo()" विधि एक पर जाने के लिए मैं "SeekBarChangeListener" द्वारा जोड़ा जा रहा

new Timer().scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     audioTraverse.setProgress(mPlayer.getCurrentPosition()); 
    } 
},0, 1000); // here 0 represents first time this timer will run... In this case it will run after 0 seconds after activity is launched 
// And 1000 represents the time interval afer which this thread i.e., "run()" will execute. In this case, it will execute after every 1 second 

अब,: नीचे कोड देखें ऑडियो फ़ाइल में विशेष अवधि। कोड इस प्रकार है:

 audioTraverse.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
       Log.i("Tranverse Change: ", Integer.toString(i)); 
       mPlayer.seekTo(i); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 
    } 
} 
0

अगर आप seekbar परिवर्तन प्रगति से विशिष्ट स्थिति के लिए मीडिया प्लेयर को फिर से शुरू करना चाहते हैं, मैं तुम्हें कि onStopTrackingTouch में() विधि करने के लिए सलाह देते हैं।वह विधि सूचित करेगी कि उपयोगकर्ता ने टच इशारा किया है, फिर खोजकर्ता की वर्तमान स्थिति से मीडिया प्लेयर स्थिति सेट करें।

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

} 

@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 

} 

@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 
    mediaPlayer.seekTo(seekBar.getProgress()); 
} 
संबंधित मुद्दे