使用android中的list-view从服务器播放音频/视频文件

时间:2014-02-11 10:02:19

标签: android android-listview android-asynctask android-mediaplayer onitemclicklistener

我正在尝试将所有音频文件从我的HTTP服务器列出到列表视图。我已成功地使用以下代码执行此操作。

class getAudiofromServer extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(ServerFileList.this);
            pDialog.setMessage("Getting File list from server, Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @SuppressWarnings("unchecked")
        @Override
        protected String doInBackground(String... arg0) {
            try {
                urlAudio = new URL("http://serverlink/folder/uploadAudio");
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            ApacheURLLister lister1 = new ApacheURLLister();
            try {
                myList = lister1.listAll(urlAudio);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        protected void onPostExecute(String file_url) {
            if (pDialog.isShowing()) {
                pDialog.dismiss();
            }

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                    ServerFileList.this, android.R.layout.simple_list_item_1,
                    myList);
            adapter.notifyDataSetChanged();
            mListView.setAdapter(adapter);
            mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            mListView.setCacheColorHint(Color.TRANSPARENT);
        }
    }

为此,我导入了ivy Apache外部库。现在我想要做的是当用户点击任何列表项时,它应该在那里播放该音频文件。为此我已经实现了以下代码。

我宣布了

    Uri uri;
    URL urlAudio;
    ListView mListView;
    PlaySongAsy play;
    MediaPlayer mp = new MediaPlayer();
    private List<String> myList = new ArrayList<String>();

mListView = (ListView) findViewById(R.id.listAudio);

然后

mListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                play = (PlaySongAsy) new PlaySongAsy(myList.get(position)
                        .replace(" ", "%20").trim()).execute();
            }
        });

然后这是我的 PlaySongAsy

class PlaySongAsy extends AsyncTask<String, Void, Boolean> {

        String baseURL;

        public PlaySongAsy(String baseURL) {
            this.baseURL = baseURL;
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            pDialog = ProgressDialog.show(ServerFileList.this,
                    "    Buffering...", "please wait..", false);
            pDialog.setCancelable(false);

        }

        @Override
        protected Boolean doInBackground(String... urls) {
            new Thread() {
                @Override
                public void run() {
                    play(baseURL);
                }
            }.start();
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            // progressDialog.dismiss();
        }
    }

最后播放方法。

private void play(String baseURL) {
        Uri myUri = Uri.parse(baseURL);
        try {
            if (mp == null) {
                this.mp = new MediaPlayer();
            } else {
                mp.stop();
                mp.reset();
            }
            mp.setDataSource(this, myUri); // Go to Initialized state

            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.setOnPreparedListener(this);
            mp.setOnBufferingUpdateListener(this);
            mp.setOnErrorListener(this);

            mp.prepareAsync();

            // mp.setVolume(5.F, 5.F);

            Log.d("", "LoadClip Done");
        } catch (Throwable t) {
            Log.d("", t.toString());
        }
    }

尝试此操作时,我收到错误,错误发生在下面。

02-18 11:49:58.266: E/AndroidRuntime(8276): FATAL EXCEPTION: main
02-18 11:49:58.266: E/AndroidRuntime(8276): java.lang.ClassCastException: java.net.URL cannot be cast to java.lang.String
02-18 11:49:58.266: E/AndroidRuntime(8276):     at iqual.fidol_final.ServerFileList$1.onItemClick(ServerFileList.java:72)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.widget.AdapterView.performItemClick(AdapterView.java:295)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.widget.AbsListView.performItemClick(AbsListView.java:1073)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2577)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.widget.AbsListView$1.run(AbsListView.java:3302)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.os.Handler.handleCallback(Handler.java:605)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.os.Looper.loop(Looper.java:154)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.app.ActivityThread.main(ActivityThread.java:4624)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at java.lang.reflect.Method.invokeNative(Native Method)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at java.lang.reflect.Method.invoke(Method.java:511)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at dalvik.system.NativeStart.main(Native Method)

提前谢谢你。

2 个答案:

答案 0 :(得分:3)

只是为了确保我们可以做这样的事情

mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {

      String url = null;
      Object o = myList.get(position);

      url = o.toString().replace(" ", "%20").trim();      
      play = (PlaySongAsy) new PlaySongAsy(url).execute();
    }
});

答案 1 :(得分:0)

您可以将php web服务中的歌曲列表转换为JSON字符串。然后从Web服务返回该JSON字符串并将其解析回某个对象的列表并用它填充addapter。