我是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) + "%");
}
}
答案 0 :(得分:2)
代码:
myList.get(position)
隐式将myList
的元素投射到String
,因为myList
是List<String>
。这是失败的,因为您设法将URL
对象插入myList
。
启用“未经检查的强制转换”警告,您应该在插入myList
的位置看到警告。
两种可能的修复方法:
消除未经检查的演员表。其中一部分可能涉及在.toString()
上调用URL
,然后再将其添加到myList
。
或者,将myList
的类型更改为List<URL>
,然后在.toString()
内进行onItemClick
调用。
您选择哪一个取决于您希望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
对象...这意味着,baseURL
是URL
对象,但您正在尝试将其投放到String
对象,这就是Exception
发生的原因。
现在,更改以下内容......
String baseURL;
到
Uri baseURL;
除了您将baseURL
引用为String
之外,请将其更改为Uri
。
答案 4 :(得分:-1)
尝试通过调用trim()
删除网址中所有不必要的空格。
请参考以下问题