1
public class StreamingMediaPlayer {

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

private TextView textStreamed;

private ImageView 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,
        ImageView playButton, 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;
        }
    });

    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"));
            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];
            /* changing the size of the buffer */

            byte[] buff = new byte[16384];

            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());
    }
}

public void change_volume(float vol) {
    Log.i("Media Player volume change", "Success" + vol);
    mediaPlayer.setVolume(vol, vol);
}

public void stop() {
    // TODO Auto-generated method stub
    mediaPlayer.stop();
}

public void stoppreviousPlayer() {
    if (mediaPlayer.isPlaying()) {

        mediaPlayer.stop();
        // mediaPlayer.release();
    }

}

}

第二课------------------------------------------------ ------------

public class Play_Radio extends Activity 
{

        private ImageView playButton;

        private TextView textStreamed, tv_radio_name, tv_radio_cat;
    private boolean isPlaying;
    private static StreamingMediaPlayer audioStreamer;
    private AudioManager audioManager = null;
    ImageView iv_like;
    Dialog rankDialog;
    RatingBar ratingBar, pre_rating;
    float cus_rating;
    AdView adView;
    public static String name, rating, like, radio_url, id, listner, image;
    private ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.play_radio);

        /*
         * LayoutInflater li = getLayoutInflater(); View layout =
         * li.inflate(R.layout.customtoast, (ViewGroup)
         * findViewById(R.id.custom_toast_layout)); Toast toast = new
         * Toast(getApplicationContext()); toast.setDuration(Toast.LENGTH_LONG);
         * toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
         * toast.setView(layout); toast.show();
         */

        // AdRequest adRequest = new AdRequest();
        // adRequest.addTestDevice(AdRequest.TEST_EMULATOR);
        // adView = (AdView)findViewById(R.id.adView);
        //

        // For listner count
        /*
         * 
         * HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost =
         * new HttpPost(
         * "http://vaibhavtech.com/work/android/radio_listner.php"); try { //
         * Add your data List<NameValuePair> nameValuePairs = new
         * ArrayList<NameValuePair>(1); nameValuePairs.add(new
         * BasicNameValuePair("id", Tab_Listner.id)); httppost.setEntity(new
         * UrlEncodedFormEntity(nameValuePairs)); ResponseHandler<String>
         * responseHandler = new BasicResponseHandler(); String response =
         * httpclient.execute(httppost, responseHandler);
         * 
         * // This is the response from a php application String reverseString =
         * response; Log.i("response", reverseString);
         * 
         * } catch (ClientProtocolException e) { Log.i("CPE response ",
         * e.toString()); // TODO Auto-generated catch block } catch
         * (IOException e) { Log.i("IOException response ", e.toString()); //
         * TODO Auto-generated catch block }
         */
        if (audioStreamer != null) {
            try {
                Log.i("Already ply", "Succss");
                audioStreamer.stop();

            } catch (Exception e) {
            }
        } else {
            Log.i("First time", "Play");

        }
        initControls();

    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        Log.i("On Pause is call", "Succcess");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        Log.i("Device Versoin is", "" + currentapiVersion);
        if (currentapiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            ActionBar actionBar = getActionBar();
            actionBar.setHomeButtonEnabled(true);
            actionBar.setDisplayHomeAsUpEnabled(true);
            getMenuInflater().inflate(R.menu.main, menu);
            Log.i("Android Device above", "Home Enbled");
        }

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub

        switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        case R.id.home:
            Intent intent = new Intent(this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            Log.i("Home", "Press");
            return true;

        }
        return super.onOptionsItemSelected(item);
    }

    // protected void onDestroy()
    // {
    // super.onDestroy();
    //
    //
    // if ( audioStreamer != null)
    // { audioStreamer.interrupt();
    // }
    //
    // }

    private void initControls() {
        iv_like = (ImageView) findViewById(R.id.iv_activity_like);
        iv_like.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v1.vibrate(40);
                Toast.makeText(getApplicationContext(),
                        "Thanks For like Our Station", Toast.LENGTH_LONG)
                        .show();

                // Like increament
                /*
                 * HttpClient httpclient = new DefaultHttpClient(); HttpPost
                 * httppost = new HttpPost(
                 * "http://www.vaibhavtech.com/work/android/radio_like.php");
                 * 
                 * try { // Add your data List<NameValuePair> nameValuePairs =
                 * new ArrayList<NameValuePair>( 1); nameValuePairs.add(new
                 * BasicNameValuePair("id", Tab_Listner.id));
                 * 
                 * 
                 * 
                 * httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                 * 
                 * // Execute HTTP Post Request
                 * 
                 * ResponseHandler<String> responseHandler = new
                 * BasicResponseHandler(); String response =
                 * httpclient.execute(httppost, responseHandler);
                 * 
                 * // This is the response from a php application String
                 * reverseString = response; Log.i("response", reverseString);
                 * 
                 * } catch (ClientProtocolException e) { Log.i("CPE response ",
                 * e.toString()); // TODO Auto-generated catch block } catch
                 * (IOException e) { Log.i("IOException response ",
                 * e.toString()); // TODO Auto-generated catch block }
                 */
            }
        });
        audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        textStreamed = (TextView) findViewById(R.id.text_kb_streamed);

        playButton = (ImageView) findViewById(R.id.imageView1);
        playButton.setEnabled(false);
        playButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Log.i("Click sadg   ", "success");

                Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v1.vibrate(40);
                if (audioStreamer.getMediaPlayer().isPlaying()) {
                    Log.i("play ", "success");
                    audioStreamer.getMediaPlayer().pause();
                    playButton.setImageResource(R.drawable.play_radio_play);
                } else {
                    Log.i("pause", "success");
                    audioStreamer.getMediaPlayer().start();
                    audioStreamer.startPlayProgressUpdater();
                    playButton.setImageResource(R.drawable.play_radio_pause);
                }
                isPlaying = !isPlaying;
            }
        });

        // rating radio sation

        ImageView rankBtn = (ImageView) findViewById(R.id.iv_activity_rating);
        rankBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                rankDialog = new Dialog(Play_Radio.this,
                        R.style.FullHeightDialog);
                rankDialog.setContentView(R.layout.rating_bar);
                rankDialog.setCancelable(true);
                ratingBar = (RatingBar) rankDialog
                        .findViewById(R.id.dialog_ratingbar);
                float userRankValue = 0;
                // ratingBar.setRating(userRankValue);
                ratingBar
                        .setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
                            @Override
                            public void onRatingChanged(RatingBar ratingBar,
                                    float rating, boolean fromUser) {
                                // TODO Auto-generated method stub
                                cus_rating = rating;

                            }
                        });

                Button updateButton = (Button) rankDialog
                        .findViewById(R.id.rank_dialog_button);
                updateButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(Play_Radio.this,
                                "Thanks For Rating Our Stations",
                                Toast.LENGTH_LONG).show();
                        /*
                         * HttpClient httpclient = new DefaultHttpClient();
                         * HttpPost httppost = new HttpPost(
                         * "http://www.vaibhavtech.com/work/android/radio_rat.php"
                         * );
                         * 
                         * try { // Add your data List<NameValuePair>
                         * nameValuePairs = new ArrayList<NameValuePair>( 3);
                         * nameValuePairs.add(new BasicNameValuePair("id",
                         * Tab_Listner.id)); nameValuePairs.add(new
                         * BasicNameValuePair("rate", "" + cus_rating));
                         * nameValuePairs.add(new BasicNameValuePair("type", ""
                         * + 2)); httppost.setEntity(new UrlEncodedFormEntity(
                         * nameValuePairs));
                         * 
                         * // Execute HTTP Post Request
                         * 
                         * ResponseHandler<String> responseHandler = new
                         * BasicResponseHandler(); String response =
                         * httpclient.execute(httppost, responseHandler);
                         * 
                         * // This is the response from a php application String
                         * reverseString = response; Log.i("response",
                         * reverseString);
                         * 
                         * } catch (ClientProtocolException e) {
                         * Log.i("CPE response ", e.toString()); // TODO
                         * Auto-generated catch block } catch (IOException e) {
                         * Log.i("IOException response ", e.toString()); // TODO
                         * Auto-generated catch block }
                         */
                        rankDialog.dismiss();
                    }
                });
                // now that the dialog is set up, it's time to show it
                rankDialog.show();
            }
        });

        String urlstring2 = Tab_Listner.radio_url;
        Toast.makeText(Play_Radio.this,
                "Please Wait ...Radio Is Gonna To Play...", Toast.LENGTH_LONG)
                .show();
        startStreamingAudio(urlstring2);
        tv_radio_cat = (TextView) findViewById(R.id.tv_play_radio_cat);
        tv_radio_name = (TextView) findViewById(R.id.tv_play_radio_name);
        tv_radio_name.setText(Tab_Listner.name);
        pre_rating = (RatingBar) findViewById(R.id.ratingBar1);
        pre_rating.setRating(Float.parseFloat(Tab_Listner.rating));
    }

    private void startStreamingAudio(String urlstring) {
        try {
            final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
            if (audioStreamer != null) {
                audioStreamer.interrupt();
            }
            audioStreamer = new StreamingMediaPlayer(this, textStreamed,
                    playButton, progressBar);
            audioStreamer.startStreaming(urlstring, 5208, 216);
            // streamButton.setEnabled(false);
            // playButton.setEnabled(true);
        } catch (Exception e) {
            Log.e(getClass().getName(), "Error starting to stream audio.", e);
        }

    }

    public void onItemSelected(AdapterView parent, View v, int position, long id) {
        mSwitcher.setImageResource(mImageIds[position]);
    }

    public void onNothingSelected(AdapterView parent) {
    }

    public View makeView() {
        ImageView i = new ImageView(this);
        i.setBackgroundColor(0xFF000000);
        i.setScaleType(ImageView.ScaleType.FIT_CENTER);
        i.setLayoutParams(new ImageSwitcher.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        return i;
    }

    private ImageSwitcher mSwitcher;

    public class ImageAdapter extends BaseAdapter {
        public ImageAdapter(Context c) {
            mContext = c;
        }

        public int getCount() {
            return mThumbIds.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(mContext);

            i.setImageResource(mThumbIds[position]);
            i.setAdjustViewBounds(true);
            i.setLayoutParams(new Gallery.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            i.setBackgroundResource(R.drawable.picture_frame);
            return i;
        }

        private Context mContext;

    }

    private Integer[] mThumbIds = { R.drawable.calculator, R.drawable.calendar,
            R.drawable.camera };

    private Integer[] mImageIds = { R.drawable.calculator, R.drawable.calendar,
            R.drawable.camera };

}

如何在此代码中添加进度条微调器。微调器像 youtube 一样工作,然后缓冲开始停止。请帮助我。我已经添加了进度条,但他们现在无法工作。请检查谷歌播放上的调整。在此处输入链接描述

4

1 回答 1

1

在您的 XML 中添加一个进度条元素,然后在您想查看进度条时隐藏/显示此元素。

    <!-- Show spinner by default and set to 'gone' when load is complete -->
<ProgressBar
    android:id="@+id/myProgressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@android:style/Widget.ProgressBar.Small"
    android:layout_marginLeft="5dp"
    android:indeterminate="true" /> 

在代码中隐藏进度条:

ProgressBar pBar = (ProgressBar)vi.findViewById(R.id.myProgressBar);
pBar.setVisibility(View.GONE);    

..再次显示:

pBar.setVisibility(View.VISIBLE);

您可以在显示负载已开始的 Toast 消息的同时拨打这些电话。

于 2013-10-26T08:15:05.583 回答