0

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

}

誰かが私を助けることができればありがとう!

4

2 に答える 2

1

AsyncTask のタイプを URL、Void、IcyStreamData として宣言しましたが、(URL ではなく) URI を渡そうとしています。その URI を URL に変換する必要があります。java.net.URI を使用している場合は、uri.toURL(); を試すことができます。

ダイアログから URL を設定する限り、edittext からアクティビティにデータを送信できる独自のカスタム ダイアログを作成します。次に、ダイアログに onDismissListener を設定し、ダイアログが閉じられたら、ダイアログから返された値があるかどうかを確認し、それを使用してタスクを実行します。(もちろん、正規表現を使用してURLを検証する必要があります/使用できます)

そもそも URL を使用しない理由がわかりませんが、Uri.Builder を使用してみてから、builder.build().toString() を呼び出して URL の文字列を取得できます。または、 uri.toString() を試して、必要なものが得られるかどうかを確認してください。たとえば、 URL url = new URL(uri.toString()); です。

于 2012-09-02T05:38:16.923 に答える
0

これが私がそれを機能させる方法です...これが他の人の時間を節約できることを願っています...

 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);
 alertBuilder.setPositiveButton("Play", new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dlg, int whichButton) {
            //do stuff here

ユーザー入力から Uri を取得します。

Uri uri = Uri.parse(input.getText().toString());

ユーザー入力を URL に変換する必要があります。

URL url = null;
                try {
                    url = new URL(uri.toString());
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();

                }

次に、doInBackground で:

@Override
            protected IcyStreamMeta doInBackground(URL... urls)
            {

                try 
                {
                    streamMeta.refreshMeta();
                    Log.e("Retrieving MetaData","Refreshed Metadata");
                } 
                catch (IOException e) 
                {
                    Log.e(MetadataTask1.class.toString(), e.getMessage());
                }
                return streamMeta;
            }

URL を渡しながら AsyncTask を呼び出します。

streamMeta.setStreamUrl(url);
MetadataTask1 metadataTask1 = new MetadataTask1();
metadataTask1.execute(url);
于 2012-09-02T14:12:58.283 に答える