如何监控Media Player收到的网络流量

时间:2012-06-15 06:05:14

标签: java android android-mediaplayer android-wifi android-networking

我只想监视MediaPlayer使用的所有流量并在TextView上向用户显示此数据用法,但这不能仅在第一次返回某些字节而不在Handler Thread上增加这些字节的同时增加一个计数器在处理程序上

单击“启动MediaPlayer”应该启动并且应该增加“数据使用值”,同时单击停止MediaPlayer停止并且相应的NetworkUsage数据增量也应该停止

这适用于计数器但不适用     mStartRx = TrafficStats.getUidRxBytes(Process.myUid());

请帮助 以下是我在Android 2.2 API级别8上尝试过的代码段

public class AndroidHandlerRunnableActivity extends Activity
{

 private int cnt = 0;
 Button Start, Stop;
 TextView counter;
 long mStartRx;
 private Handler handler = new Handler();
 private MediaPlayer mediaPlayer;
 ProgressDialog progressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        counter = (TextView)findViewById(R.id.counter);
        Start = (Button)findViewById(R.id.Start);
        Start.setEnabled(true);
        Stop = (Button)findViewById(R.id.Stop);
        Stop.setEnabled(false);

        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setOnPreparedListener(new MediaOnPreparedListener());   
        String networkURL = "http://currentstream1.publicradio.org/";   
            try
            {
                mediaPlayer.setDataSource(networkURL);
            } 
            catch (Exception e)
            {           
                e.printStackTrace();
            }       
        mediaPlayer.prepareAsync();
        mStartRx =  TrafficStats.getUidRxBytes(Process.myUid());
        progressDialog = ProgressDialog.show(this, "Playing audio", "Please wait...."); 


        Start.setOnClickListener(new Button.OnClickListener()
        {
               @Override
               public void onClick(View v) 
               {            
                   handler.post(timedTask);
                   mediaPlayer.start();
                   Start.setEnabled(false);
                   Stop.setEnabled(true);               
               }
        });

        Stop.setOnClickListener(new Button.OnClickListener()
        {
             public void onClick(View v) 
             {          
                    handler.removeCallbacks(timedTask);
                    mediaPlayer.stop();
                    Start.setEnabled(true);
                    Stop.setEnabled(false);
              }
        });
}

    private class MediaOnPreparedListener implements MediaPlayer.OnPreparedListener
    {
        @Override
        public void onPrepared(MediaPlayer mp) 
        {       
            if (progressDialog != null) 
            {               
                progressDialog.dismiss();
            }               
        }       
    }

    private Runnable timedTask = new Runnable()
    {
            @Override
          public void run() 
          {     
               cnt++;
               mStartRx =  TrafficStats.getUidRxBytes(Process.myUid());
               counter.setText(String.valueOf(cnt)+" Data "+mStartRx);
               handler.postDelayed(timedTask, 2000);
          }
     };


        @Override
        protected void onStop() 
        {
            super.onStop();
            if (mediaPlayer != null)
            {           
                mediaPlayer.stop();
                mediaPlayer.reset();
                mediaPlayer.release();
            }
        }
}

获取更多帮助这是我的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
        android:id="@+id/Start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Start" />

    <Button
        android:id="@+id/Stop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Stop" />

    <TextView
        android:id="@+id/counter"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

最明显的文件如下

   <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exercise.AndroidHandlerRunnable"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".AndroidHandlerRunnableActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

1 个答案:

答案 0 :(得分:0)

以下是您的线程问题的answer

此外,您应该将所有ui内容放在onResume()中,而不是onCreate()中。在UI线程有机会开始之前(或者在UI线程有机会恢复之前)尝试操作UI可能会有问题。

您应该将onStop()内部正在调用的代码放在onPause()内。保证在退出活动时调用onPause()onStop()不是。例如,当用户按下主页按钮或手机接到电话时,您可以测试此用例。

以下是Activity Lifecycle的一些信息。值得给这个页面一个非常仔细的阅读。