Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android中播放来自服务器的音频_Java_Android_Audio_Android Listview_Classcastexception - Fatal编程技术网

Java 如何在android中播放来自服务器的音频

Java 如何在android中播放来自服务器的音频,java,android,audio,android-listview,classcastexception,Java,Android,Audio,Android Listview,Classcastexception,我通过以下代码将所有音频文件列表从服务器转到列表视图 public class ServerFileList extends Activity { URL urlAudio; ListView mListView; ProgressDialog pDialog; private MediaPlayer mp = new MediaPlayer(); private List<String> myList = new ArrayList<

我通过以下代码将所有音频文件列表从服务器转到列表视图

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

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

像这样的改变: 播放歌曲(urlAudio+myList.get(position))


播放歌曲(urlAudio.toString()+myList.get(position))

我不知道这段代码是否对您有帮助

但是试试看:

在重新创建之前

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

我已经设法解决了这个问题,只是在我的mclicklistner中添加了下面的一段代码,它现在运行良好

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

请将您要传递的url字符串发布到playSong()中,好吗?谢谢是的,您可以在上面检查mp3文件名。myList.get(position)在调用中返回的是什么:playSong(urlAudio+myList.get(position))?它将返回列表视图项的位置我知道它从技术上返回什么。我想知道你打电话时得到的价值是多少。您是否尝试过调试应用程序,在“播放歌曲”前停下来检查到底通过了什么?您正在连接两个字符串。一个显然是URL,它不能“按原样”添加到字符串中。需要使用toString方法将其转换为字符串。另一部分由列表返回。你能不能把这两件事分解一下,存储在局部变量中,调试一下,看看填充的值是什么,它们是否正确。谢谢但是urlAudio不是一个字符串,在调用时我不能在参数中传递URL。但是你不能从任何地方调用playSong方法。现在检查代码,如果你不需要playSong方法中的“songPath”,请将其从方法和callingOkay中删除,如果将songPath保留在方法中,那么我将得到与前面相同的错误。但若我删除路径,那个么我并没有得到错误,但我也不能播放歌曲。意味着它没有播放那个音频。还有一件事我得到了E/MediaPlayer(27461):错误(1,-2147483648)logcat中的这个错误。
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());
}
String url = null;
Object o = myList.get(position);
url = o.toString().replace(" ", "%20").trim();
play = (PlaySongAsy) new PlaySongAsy(url).execute();