【问题标题】:playing audio/video file from server using list-view in android使用 android 中的列表视图从服务器播放音频/视频文件
【发布时间】:2014-02-11 10:02:18
【问题描述】:

我正在尝试将我的 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)

提前谢谢你。

【问题讨论】:

  • 那你有什么问题?
  • @Rakhita,检查我的错误日志,我已经编辑了问题。
  • 你通过网络服务得到了什么,是json字符串吗?
  • @Rakhita,我没有使用任何网络服务。我已经使用 ivy apache 库来列出服务器中的所有音频文件。
  • 我不确定你是否可以直接这样做.. myList = lister1.listAll(urlAudio);因为我的列表是一个参数化的字符串列表,但 lister1.listAll 只返回一个 List...

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


【解决方案1】:

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

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

【讨论】:

  • 现在它没有给出错误但它没有播放音频也意味着我听不到任何声音。
  • 日志呢?如果日志打印了任何内容,则意味着您获取的对象不是字符串。
  • 在日志中我刚刚收到java.net.URL 就是这样。没有别的了。
  • 我已经编辑了答案,请现在检查它是否有效...回答
  • 你太棒了,非常感谢@Rakhita,很棒的工作......现在正在工作。
【解决方案2】:

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

【讨论】:

  • 很难找到满足您所有要求的示例。你应该把这个问题分成几部分。首先搜索如何在php中创建json字符串。其次是如何从android调用php web服务,然后是如何在android中解析json字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多