Radio stream app tutorial

  • 4 Antworten
  • Letztes Antwortdatum
L

lunifrw

Neues Mitglied
0
Guten tag,
bin neu in android programmierung
und wollte mal fragen ob jemand ein gutes tutorial hat um ein radio stream app zu programmieren. sollte bloß ein Playbutten und ein stop Butten haben und vielleicht das der track der gerade gespielt wird angezeigt wird
 
Bist du neu in der Android Programmierung oder im Programmieren generell?
Sollte ersteres zutreffen, was ich bezweifle, dann überlege doch mal was du dafür benötigtst.
Erstmal vom Layout her:
- Buttons, String
Dann was passiert im Hintergrund:
- Stream
- Webseite parsen(?)

Sollte zweiters der fall sein -> Suche dir ein einfachers erst Projekt...

Gruß
 
naja habe vorher mal kleine projekte in vb.net gemacht gucke mir neben bei auch noch "video2brain Androit4" an um die enwicklingsumgebung besser kennen zu lernen also denn layout habe ick schon fertig.
habe schon einige vorlagen ausprobiert z.Bjava - Online radio streaming app for Android - Stack Overflow

aber wenn ick es denn im emulator starte startet alles aber spielt nix ab und wenn ick es in BlueStacks(ist ein programm um android apps aufen rechner zu installieren) denn startet es und wenn ick auf denn stop buttton klicke denn startet er komischerweise denn stream
 
Zuletzt bearbeitet:
Dann solltest du mal den relevanten Code zeigen.

Gruß
 
Also das sind jetzt die codes von die 2 activitys soweit klappt auch alles bloß im LogCat zeigt er das problem an "Buffered File path: /data/data/eu.rac.streaming/cache/playingMedia0.dat"

und könnte mir jemand sagen wie ick das einstelle das wenn ich auf button_play(pause) drücke das er denn aufhört denn stream weiter zu laden weil im "text_kb_streamed (TextView)" zeigt er an das er noch weiter laden tut. ist es möglich das wenn man da rauf drückt komplet aufhört zu laden?

eu.mediaplayer Activity

HTML:
package eu.mediaplayer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Handler;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * MediaPlayer does not yet support streaming from external URLs so this class provides a pseudo-streaming function
 * by downloading the content incrementally & playing as soon as we get enough audio in our temporary storage.
 */
public class StreamingMediaPlayer {

    private static final int INTIAL_KB_BUFFER =  96*10/8;//assume 96kbps*10secs/8bits per byte

    private TextView textStreamed;
    
    private ImageButton playButton;
    
    private ProgressBar    progressBar;
    
    //  Track for display by progressBar
    private long mediaLengthInKb, mediaLengthInSeconds;
    private int totalKbRead = 0;
    
    // Create Handler to call View updates on the main UI thread.
    private final Handler handler = new Handler();

    private MediaPlayer     mediaPlayer;
    
    private File downloadingMediaFile;
    
    private boolean isInterrupted;
    
    private Context context;
    
    private int counter = 0;
    
     public StreamingMediaPlayer(Context  context,TextView textStreamed, ImageButton    playButton, Button    streamButton,ProgressBar    progressBar)
     {
         this.context = context;
        this.textStreamed = textStreamed;
        this.playButton = playButton;
        this.progressBar = progressBar;
    }
    
    /**  
     * Progressivly download the media to a temporary location and update the MediaPlayer as new content becomes available.
     */  
    public void startStreaming(final String mediaUrl, long    mediaLengthInKb, long    mediaLengthInSeconds) throws IOException {
        
        this.mediaLengthInKb = mediaLengthInKb;
        this.mediaLengthInSeconds = mediaLengthInSeconds;
        
        Runnable r = new Runnable() {  
            public void run() {  
                try {  
                    downloadAudioIncrement(mediaUrl);
                } catch (IOException e) {
                    Log.e(getClass().getName(), "Unable to initialize the MediaPlayer for fileUrl=" + mediaUrl, e);
                    return;
                }  
            }  
        };  
        new Thread(r).start();
    }
    
    /**  
     * Download the url stream to a temporary location and then call the setDataSource  
     * for that local file
     */  
    public void downloadAudioIncrement(String mediaUrl) throws IOException {
        
        URLConnection cn = new URL(mediaUrl).openConnection();  
        cn.connect();  
        InputStream stream = cn.getInputStream();
        if (stream == null) {
            Log.e(getClass().getName(), "Unable to create InputStream for mediaUrl:" + mediaUrl);
        }
        
        downloadingMediaFile = new File(context.getCacheDir(),"downloadingMedia.dat");
        
        // Just in case a prior deletion failed because our code crashed or something, we also delete any previously
        // downloaded file to ensure we start fresh.  If you use this code, always delete
        // no longer used downloads else you'll quickly fill up your hard disk memory.  Of course, you can also
        // store any previously downloaded file in a separate data cache for instant replay if you wanted as well.
        if (downloadingMediaFile.exists()) {
            downloadingMediaFile.delete();
        }

        FileOutputStream out = new FileOutputStream(downloadingMediaFile);  
        byte buf[] = new byte[16384];
        int totalBytesRead = 0, incrementalBytesRead = 0;
        do {
            int numread = stream.read(buf);  
            if (numread <= 0)  
                break;  
            out.write(buf, 0, numread);
            totalBytesRead += numread;
            incrementalBytesRead += numread;
            totalKbRead = totalBytesRead/1000;
            
            testMediaBuffer();
               fireDataLoadUpdate();
        } while (validateNotInterrupted());  
               stream.close();
        if (validateNotInterrupted()) {
               fireDataFullyLoaded();
        }
    }  

    private boolean validateNotInterrupted() {
        if (isInterrupted) {
            if (mediaPlayer != null) {
                mediaPlayer.pause();
                //mediaPlayer.release();
            }
            return false;
        } else {
            return true;
        }
    }

    
    /**
     * Test whether we need to transfer buffered data to the MediaPlayer.
     * Interacting with MediaPlayer on non-main UI thread can causes crashes to so perform this using a Handler.
     */  
    private void  testMediaBuffer() {
        Runnable updater = new Runnable() {
            public void run() {
                if (mediaPlayer == null) {
                    //  Only create the MediaPlayer once we have the minimum buffered data
                    if ( totalKbRead >= INTIAL_KB_BUFFER) {
                        try {
                            startMediaPlayer();
                        } catch (Exception e) {
                            Log.e(getClass().getName(), "Error copying buffered conent.", e);                
                        }
                    }
                } else if ( mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition() <= 1000 ){
                    //  NOTE:  The media player has stopped at the end so transfer any existing buffered data
                    //  We test for < 1second of data because the media player can stop when there is still
                    //  a few milliseconds of data left to play
                    transferBufferToMediaPlayer();
                }
            }
        };
        handler.post(updater);
    }
    
    private void startMediaPlayer() {
        try {  
            File bufferedFile = new File(context.getCacheDir(),"playingMedia" + (counter++) + ".dat");
            
            // We double buffer the data to avoid potential read/write errors that could happen if the
            // download thread attempted to write at the same time the MediaPlayer was trying to read.
            // For example, we can't guarantee that the MediaPlayer won't open a file for playing and leave it locked while
            // the media is playing.  This would permanently deadlock the file download.  To avoid such a deadloack,
            // we move the currently loaded data to a temporary buffer file that we start playing while the remaining
            // data downloads.  
            moveFile(downloadingMediaFile,bufferedFile);
            
            Log.e(getClass().getName(),"Buffered File path: " + bufferedFile.getAbsolutePath());
            Log.e(getClass().getName(),"Buffered File length: " + bufferedFile.length()+"");
            
            mediaPlayer = createMediaPlayer(bufferedFile);
            
            // We have pre-loaded enough content and started the MediaPlayer so update the buttons & progress meters.
            mediaPlayer.start();
            startPlayProgressUpdater();            
            playButton.setEnabled(true);
        } catch (IOException e) {
            Log.e(getClass().getName(), "Error initializing the MediaPlayer.", e);
            return;
        }  
    }
    
    private MediaPlayer createMediaPlayer(File mediaFile)
    throws IOException {
        MediaPlayer mPlayer = new MediaPlayer();
        mPlayer.setOnErrorListener(
                new MediaPlayer.OnErrorListener() {
                    public boolean onError(MediaPlayer mp, int what, int extra) {
                        Log.e(getClass().getName(), "Error in MediaPlayer: (" + what +") with extra (" +extra +")" );
                        return false;
                    }
                });

        //  It appears that for security/permission reasons, it is better to pass a FileDescriptor rather than a direct path to the File.
        //  Also I have seen errors such as "PVMFErrNotSupported" and "Prepare failed.: status=0x1" if a file path String is passed to
        //  setDataSource().  So unless otherwise noted, we use a FileDescriptor here.
        FileInputStream fis = new FileInputStream(mediaFile);
        mPlayer.setDataSource(fis.getFD());
        mPlayer.prepare();
        return mPlayer;
    }
    
    /**
     * Transfer buffered data to the MediaPlayer.
     * NOTE: Interacting with a MediaPlayer on a non-main UI thread can cause thread-lock and crashes so
     * this method should always be called using a Handler.
     */  
    private void transferBufferToMediaPlayer() {
        try {
            // First determine if we need to restart the player after transferring data...e.g. perhaps the user pressed pause
            boolean wasPlaying = mediaPlayer.isPlaying();
            int curPosition = mediaPlayer.getCurrentPosition();
            
            // Copy the currently downloaded content to a new buffered File.  Store the old File for deleting later.
            File oldBufferedFile = new File(context.getCacheDir(),"playingMedia" + counter + ".dat");
            File bufferedFile = new File(context.getCacheDir(),"playingMedia" + (counter++) + ".dat");

            //  This may be the last buffered File so ask that it be delete on exit.  If it's already deleted, then this won't mean anything.  If you want to
            // keep and track fully downloaded files for later use, write caching code and please send me a copy.
            bufferedFile.deleteOnExit();  
            moveFile(downloadingMediaFile,bufferedFile);

            // Pause the current player now as we are about to create and start a new one.  So far (Android v1.5),
            // this always happens so quickly that the user never realized we've stopped the player and started a new one
            mediaPlayer.pause();

            // Create a new MediaPlayer rather than try to re-prepare the prior one.
            mediaPlayer = createMediaPlayer(bufferedFile);
            mediaPlayer.seekTo(curPosition);
            
            //  Restart if at end of prior buffered content or mediaPlayer was previously playing.  
            //    NOTE:  We test for < 1second of data because the media player can stop when there is still
            //  a few milliseconds of data left to play
            boolean atEndOfFile = mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition() <= 1000;
            if (wasPlaying || atEndOfFile){
                mediaPlayer.start();
            }

            // Lastly delete the previously playing buffered File as it's no longer needed.
            oldBufferedFile.delete();
            
        }catch (Exception e) {
            Log.e(getClass().getName(), "Error updating to newly loaded content.", e);                    
        }
    }
    
    private void fireDataLoadUpdate() {
        Runnable updater = new Runnable() {
            public void run() {
                textStreamed.setText((totalKbRead + " Kb read"));
                float loadProgress = ((float)totalKbRead/(float)mediaLengthInKb);
                progressBar.setSecondaryProgress((int)(loadProgress*100));
            }
        };
        handler.post(updater);
    }
    
    private void fireDataFullyLoaded() {
        Runnable updater = new Runnable() {
            public void run() {
                   transferBufferToMediaPlayer();

                   // Delete the downloaded File as it's now been transferred to the currently playing buffer file.
                   downloadingMediaFile.delete();
                textStreamed.setText(("Audio full loaded: " + totalKbRead + " Kb read"));
            }
        };
        handler.post(updater);
    }
    
    public MediaPlayer getMediaPlayer() {
        return mediaPlayer;
    }
    
    public void startPlayProgressUpdater() {
        float progress = (((float)mediaPlayer.getCurrentPosition()/1000)/mediaLengthInSeconds);
        progressBar.setProgress((int)(progress*100));
        
        if (mediaPlayer.isPlaying()) {
            Runnable notification = new Runnable() {
                public void run() {
                    startPlayProgressUpdater();
                }
            };
            handler.postDelayed(notification,1000);
        }
    }    
    
    public void interrupt() {
        playButton.setEnabled(false);
        isInterrupted = true;
        validateNotInterrupted();
    }
    
    /**
     *  Move the file in oldLocation to newLocation.
     */
    public void moveFile(File    oldLocation, File    newLocation)
    throws IOException {

        if ( oldLocation.exists( )) {
            BufferedInputStream  reader = new BufferedInputStream( new FileInputStream(oldLocation) );
            BufferedOutputStream  writer = new BufferedOutputStream( new FileOutputStream(newLocation, false));
            try {
                byte[]  buff = new byte[8192];
                int numChars;
                while ( (numChars = reader.read(  buff, 0, buff.length ) ) != -1) {
                    writer.write( buff, 0, numChars );
                  }
            } catch( IOException ex ) {
                throw new IOException("IOException when transferring " + oldLocation.getPath() + " to " + newLocation.getPath());
            } finally {
                try {
                    if ( reader != null ){                        
                        writer.close();
                        reader.close();
                    }
                } catch( IOException ex ){
                    Log.e(getClass().getName(),"Error closing files when transferring " + oldLocation.getPath() + " to " + newLocation.getPath() );
                }
            }
        } else {
            throw new IOException("Old location does not exist when transferring " + oldLocation.getPath() + " to " + newLocation.getPath() );
        }
    }
}
Radio Activity

HTML:
package eu.streaming;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
import android.util.Log;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import eu.mediaplayer.StreamingMediaPlayer;



public class RadioActivity extends Activity {

    private Button streamButton;
    
    private ImageButton playButton;
    
    private TextView textStreamed;
    
    private boolean isPlaying;
    
    private StreamingMediaPlayer audioStreamer;
    
    @Override
    public void onCreate(Bundle icicle) {
        
        super.onCreate(icicle);

        setContentView(R.layout.radiog);
        initControls();
    }
    
    private void initControls() {
        textStreamed = (TextView) findViewById(R.id.text_kb_streamed);
        streamButton = (Button) findViewById(R.id.button_stream);
        streamButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                startStreamingAudio();
        }});

        playButton = (ImageButton) findViewById(R.id.button_play);
        playButton.setEnabled(false);
        playButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (audioStreamer.getMediaPlayer().isPlaying()) {
                    audioStreamer.getMediaPlayer().pause();
                    playButton.setImageResource(R.drawable.button_play);
                } else {
                    audioStreamer.getMediaPlayer().start();
                    audioStreamer.startPlayProgressUpdater();
                    playButton.setImageResource(R.drawable.button_pause);
                }
                isPlaying = !isPlaying;
        }});
    }
    
    private void startStreamingAudio() {
        try {
            final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
            if ( audioStreamer != null) {
                audioStreamer.interrupt();
            }
            audioStreamer = new StreamingMediaPlayer(this,textStreamed, playButton, streamButton,progressBar);
            audioStreamer.startStreaming("http://usa8-vn.mixstream.net:8138",5208, 216);
            streamButton.setEnabled(false);
        } catch (IOException e) {
            Log.e(getClass().getName(), "Error starting to stream audio.", e);                    
        }
        
    /** Called when the activity is first created. */


    
        Button tutorial1Button = (Button) findViewById(R.id.mainbutton);
        tutorial1Button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                startActivity(new Intent(RadiogActivity.this, MainActivity.class));
        }});
    }
    
    public void finish(){
        this.onDestroy();
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
        
    
}
EDIT:
und das zeigt er mir am anfang in LogCat an: error opening trace file: No such file or directory (2)

und kann man in der app denn die track namen anzeigen lassen (wenn ich denn stream über winamp oder so aufen pc abspiele zeigt er mir ja an welcher track gerade läuft ist es bei android auch möglich) wenn ja hat einer dafür eine lösung in google habe ick bis jetzt noch nichts gefunden oder habe falsch gesucht vielleicht weiß ja einer nach was ick genau suchen muss oder hat vielleicht auch nen code für mich
 
Zuletzt bearbeitet:

Ähnliche Themen

G
Antworten
0
Aufrufe
111
Gerdchen07
G
G
Antworten
1
Aufrufe
370
Gerdchen07
G
G
Antworten
13
Aufrufe
583
Gerdchen07
G
L
Antworten
2
Aufrufe
490
Lexub
L
migi01
Antworten
26
Aufrufe
1.941
migi01
migi01
Zurück
Oben Unten