URL无法转换为String

时间:2014-02-18 06:27:56

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

我是android的新手,并尝试开发应用程序以将所有mp3文件从服务器加载到列表视图,通过单击列表项,它应该直接从服务器播放该mp3文件。

不知何故,我能够列出从服务器到列表视图的所有mp3文件,但是当我点击列表视图的项目来播放该特定歌曲时,它会给我以下错误。

logcat的

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)

Java代码

public class ServerFileList extends Activity implements
        OnBufferingUpdateListener, OnErrorListener, OnPreparedListener {

    Uri uri;
    URL urlAudio;
    ListView mListView;
    PlaySongAsy play;

    ProgressDialog pDialog;
    JSONParser jParser = new JSONParser();
    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);

        if (Const.server == 0) {
            new getAudiofromServer().execute();
        } else {
            new getVideofromServer().execute();
        }

        // new downloadAudio().execute();

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

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

    public void updateProgress(int currentSize, int totalSize) {
        TextView mTextView = new TextView(ServerFileList.this);
        mTextView.setText(Long.toString((currentSize / totalSize) * 100) + "%");
    }
    }

5 个答案:

答案 0 :(得分:2)

代码:

myList.get(position)

隐式将myList的元素投射到String,因为myListList<String>。这是失败的,因为您设法将URL对象插入myList

启用“未经检查的强制转换”警告,您应该在插入myList的位置看到警告。

两种可能的修复方法:

  1. 消除未经检查的演员表。其中一部分可能涉及在.toString()上调用URL,然后再将其添加到myList

  2. 或者,将myList的类型更改为List<URL>,然后在.toString()内进行onItemClick调用。

  3. 您选择哪一个取决于您希望myList拥有的类型。

答案 1 :(得分:0)

在URL对象上调用toString()方法以获取字符串形式。 请参阅http://docs.oracle.com/javase/6/docs/api/java/net/URL.html#toString%28%29

答案 2 :(得分:0)

我认为myList包含错误的对象。您将URI放入其中,而不是Strings。填写清单时,在toString上使用Uri方法。

找到你这样做的地方:

myList.add((String)uri);

并改为:

myList.add(uri.toString());

答案 3 :(得分:0)

你的'例外说......

java.lang.ClassCastException: java.net.URL cannot be cast to java.lang.String

大胆地指出,您试图将URL投射到String对象...这意味着,baseURLURL对象,但您正在尝试将其投放到String对象,这就是Exception发生的原因。

现在,更改以下内容......

String baseURL;

Uri baseURL;

除了您将baseURL引用为String之外,请将其更改为Uri

答案 4 :(得分:-1)

尝试通过调用trim()删除网址中所有不必要的空格。 请参考以下问题

Android: howto parse URL String with spaces to URI object?