URLをコードに入れるとうまく機能するshoutcastストリームからicyメタデータをプルするようにAsynctaskをセットアップしましたが、AlertDialogがユーザー入力からAsynctaskにURLを渡すようにします。次のように AsyncTask を呼び出しています。
MetadataTask1 metadataTask1 = new MetadataTask1();
metadataTask1.execute(uri);
「uri」を Asynctask に渡すと、エラーが発生します。
「タイプ AsyncTask のメソッド execute(URL...) は、引数 (Uri) には適用できません」
URL が期待されていることは知っていますが、その方法がわかりません。私は Android に非常に慣れていませんが、それは本当にシンプルで馬鹿げたものだと確信しています。
ここで 2 つのことが起こっています。ユーザー入力 URL が音楽サービスを開始し、ストリームを再生します。同じユーザー URL が AsyncTask のパラメーターになり、icy メタデータのプルを開始する必要があります。コードに手動で URL を入力するとすべてが機能すると言ったように、もちろんこれは考えではありません。私の質問は次のとおりです。1. (AlertDialog からの) ユーザー入力を処理するにはどうすればよいですか? 2. doInBackground(URL... urls) の行はどうですか?これらは間違っていると確信しています:
try {
streamMeta.setStreamUrl(new URL(
"http://sfstream1.somafm.com:8880"));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3 uri を追加しようとしたときの Eclipse エラーをどうするか?
これが私のコードです:
void showUrlDialog() {
class MetadataTask1 extends AsyncTask<URL, Void, IcyStreamMeta> {
@Override
protected IcyStreamMeta doInBackground(URL... urls)
{
try {
streamMeta.setStreamUrl(new URL(
"http://sfstream1.somafm.com:8880")); //I want a variable here from user input
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
streamMeta.refreshMeta();
Log.e("Retrieving MetaData", "Refreshed Metadata");
} catch (IOException e) {
Log.e(MetadataTask1.class.toString(), e.getMessage());
}
return streamMeta;
}
@Override
protected void onPostExecute(IcyStreamMeta result) {
//Toast toast = Toast.makeText(getBaseContext(),
// "Electropop and indie dance rock with sparkle and pop.",
// Toast.LENGTH_LONG);
//toast.setGravity(Gravity.BOTTOM, 0, 200);
//toast.show();
timer1.schedule(new TimerTask() {
public void run() {
if (timerIsOn1 == true) {
try {
title_artist = streamMeta.getArtist();
title_artist2 = streamMeta.getTitle();
Log.e("Retrieved title_artist", title_artist);
if (title_artist.length() > 0) {
runOnUiThread(new Runnable() {
public void run() {
Main.tx2.setText(title_artist);
Main.tx3.setText(title_artist2);
}
});
}
} catch (IOException e) {
Log.e(MetadataTask1.class.toString(),
e.getMessage());
}
try {
streamMeta.refreshMeta();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}, 0, 6000);
}
}
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
alertBuilder.setTitle("Manual Input");
alertBuilder.setMessage("URL (must be lowercase http://)");
final EditText input = new EditText(this);
alertBuilder.setView(input);
input.setHint("paste your URL here...");
alertBuilder.setPositiveButton("Play", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dlg, int whichButton) {
timerIsOn1 = true;
Main.tx1.setText("user station...");
Main.tx2.setText("");
Main.tx3.setText("");
// Send an intent with the URL of the song to play. This is expected by
// MusicService.
final Intent i = new Intent(MusicService.ACTION_URL);
Uri uri = Uri.parse(input.getText().toString());
i.setData(uri);
startService(i);
progressDialog = ProgressDialog.show(Main.this, "",
"connecting...");
progressDialog.setCancelable(true);
MetadataTask1 metadataTask1 = new MetadataTask1();
metadataTask1.execute(uri);
}
});
alertBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dlg, int whichButton) {}
});
alertBuilder.show();
}
誰かが私を助けることができればありがとう!