【问题标题】:How to play audio from server in android如何在android中播放来自服务器的音频
【发布时间】:2014-02-05 07:06:46
【问题描述】:

我正在通过以下代码从服务器获取所有音频文件列表到列表视图。

public class ServerFileList extends Activity {

    URL urlAudio;
    ListView mListView;
    ProgressDialog pDialog;
    private MediaPlayer mp = new MediaPlayer();
    private List<String> myList = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.serverfilelist);

        mListView = (ListView) findViewById(R.id.listAudio);
        new getAudiofromServer().execute();
        new downloadAudioFromServer().execute();

        mListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                playSong(urlAudio + myList.get(position));
            }
        });
    }

    private void playSong(String songPath) {
        try {
            mp.reset();
            mp.setDataSource(songPath);
            mp.prepare();
            mp.start();
        } catch (IOException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        }
    }

    private class downloadAudioFromServer extends
            AsyncTask<String, Integer, String> {
        @Override
        protected String doInBackground(String... url) {
            int count;

            try {
                URL url1 = new URL("http://i-qualtech.com/Fidol/uploadAudio");
                URLConnection conexion = url1.openConnection();
                conexion.connect();
                int lenghtOfFile = conexion.getContentLength();
                InputStream input = new BufferedInputStream(url1.openStream());
                OutputStream output = new FileOutputStream(
                        Environment.getExternalStorageDirectory() + "/Sounds/");
                byte data[] = new byte[1024];
                long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    publishProgress((int) (total * 100 / lenghtOfFile));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            } catch (Exception e) {
            }
            return null;
        }
    }

    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://i-qualtech.com/Fidol/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);
        }
    }
}

输出是

现在我想通过单击列表视图播放该音频文件,因为我编写了上面已经列出的代码,但出现以下错误。

我参考了下面的链接供参考。

How to play Audio file Mp3 from the server

how to play audio file from server in android

但是在这两个链接中,他们指定了要从服务器播放的特定音频文件并给出了完整路径,但我不想这样做。

我知道它明确表示我不能将 URL 转换为字符串,但我不知道如何解决这个问题。请帮忙。

02-05 01:44:58.690: E/AndroidRuntime(1998): FATAL EXCEPTION: main
02-05 01:44:58.690: E/AndroidRuntime(1998): java.lang.ClassCastException: java.net.URL cannot be cast to java.lang.String
02-05 01:44:58.690: E/AndroidRuntime(1998):     at iqual.fidol_final.ServerFileList$1.onItemClick(ServerFileList.java:53)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at android.widget.AbsListView$1.run(AbsListView.java:3463)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at android.os.Handler.handleCallback(Handler.java:730)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at android.os.Looper.loop(Looper.java:137)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at android.app.ActivityThread.main(ActivityThread.java:5103)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at java.lang.reflect.Method.invokeNative(Native Method)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at java.lang.reflect.Method.invoke(Method.java:525)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-05 01:44:58.690: E/AndroidRuntime(1998):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: java android audio android-listview classcastexception


    【解决方案1】:

    您为什么不首先通过将您的 URL 对象转换为字符串来准备播放所需的正确 URL?

    类似这样的改变: playSong(urlAudio + myList.get(position));

    到

    playSong(urlAudio.toString() + myList.get(position));

    【讨论】:

    • 你能把你传递给 playSong() 的 url 字符串贴出来吗?谢谢!
    • 是i-qualtech.com/uploadaudio/....mp3,你可以查看上面的mp3文件名。
    • 什么是 myList.get(position) 在调用中返回: playSong(urlAudio + myList.get(position)); ?
    • 它将返回列表视图项的位置
    • 我知道它在技术上返回了什么。我想知道您在拨打电话时获得的价值是多少。您是否尝试过调试应用程序,在“playSong”处停下来检查究竟是什么通过了?您正在连接 2 个字符串。一个显然是 URL,它不能“按原样”添加到字符串中。需要使用 toString 方法将其转换为字符串。另一部分由 List 返回。您能否分解这两件事,存储在局部变量中,调试并查看填充的值是什么以及它们是否正确。谢谢!
    【解决方案2】:

    不知道这段代码对你有没有帮助

    但试试看:

    在创建之前。

    Uri uri;
    

    添加到您的代码中

    mListView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    //playSong(urlAudio + myList.get(position));
                    uri =  Uri.parse(urlAudio);
                    playSong(urlAudio + myList.get(position));
                }
            });
    

    添加到播放歌曲:

    private void playSong(String songPath) {
    try {
        MediaPlayer mp = new MediaPlayer();
        mp.setDataSource(this, uri);
        mp.prepare();
        mp.start();
    }
    catch (NullReferenceArgument e) {
        Log.d(TAG, "NullReferenceException: " + e.getMessage());
    }
    catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException: " + e.getMessage());
    }
    catch (IOException e) {
        Log.d(TAG, "IOException: " + e.getMessage());
    }
    catch (IllegalArgumentException e) {
        Log.d(TAG, "IllegalArgumentException: " + e.getMessage());
    }
    catch (SecurityException e) {
        Log.d(TAG, "SecurityException: " + e.getMessage());
    }
    

    【讨论】:

    • 但是 urlAudio 是 URL 不是字符串,我不能在调用时在参数中传递 URL。
    • 但是你没有从任何地方调用 playSong 方法,它将如何工作。
    • ok ckeck 代码现在如果你不需要 playSong 方法中的 'songPath' 从方法和调用中删除它
    • 好的,如果将 songPath 保留在方法中,那么我会遇到与之前相同的错误。但是,如果我删除路径,那么我不会出错,但我也无法播放歌曲。表示它没有播放该音频。
    • 另一件事我得到 E/MediaPlayer(27461): error (1, -2147483648) logcat 中的这个错误。
    【解决方案3】:

    我已经设法解决了这个问题,只需将下面的代码添加到我的 onItemClicklistner 中,现在它工作正常,

    String url = null;
    Object o = myList.get(position);
    url = o.toString().replace(" ", "%20").trim();
    play = (PlaySongAsy) new PlaySongAsy(url).execute();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 2015-06-18
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      相关资源
      最近更新 更多