4

Я очень новичок в android и пытаюсь разработать приложение для загрузки всех mp3-файлов с сервера на просмотр списка и, щелкнув элемент списка, он должен воспроизводить этот mp3-файл непосредственно с сервера.URL не может быть отнесен к String

Как-то я могу перечислить все 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 Code

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

'doInbackground' вызывается на фоне потока. Какая потребность в том, чтобы вы начали там новый поток? – Raghunandan

+1

'playSong (urlAudio.toString() + myList.get (position));', обратите внимание на 'toString' –

+0

@Raghunandan, что вы пытаетесь сказать, извините, но я не понял вас. –

ответ

-1

Попробуйте удалить все ненужные пробелы в своем URL-адресе, позвонив по телефону trim(). Пожалуйста, обратитесь ниже вопросы, а

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

+0

Я уже использовал trim() при вызове asynctask, но это не помогает. –

0

Я думаю, что myList содержит неправильные объекты. Вы положили URI s внутри него, а не Strings. Используйте метод toString на Uri с, когда вы заполняете список.

Найти, где вы это делаете:

myList.add((String)uri); 

и перейти к:

myList.add(uri.toString()); 
+0

Я использовал библиотеку ivy apache, чтобы перечислить все файлы, поэтому my mylist - это myList = lister1.listAll (urlAudio); 'как это вместо' myList.add (uri.toString()); 'так как я могу изменить это , –

2

Код:

myList.get(position) 

неявно литье элемент myList к String, так как myList - List<String>. Это неудачно, потому что вам удалось вставить объект URL в myList.

Включите предупреждения «непроверенный бросок», и вы должны увидеть предупреждение, в которое вы вставляете в myList.

Два возможных исправлений:

  1. Устранить непроверенную бросок. Часть этого, вероятно, будет связана с вызовом .toString() на вашем URL перед добавлением его в myList.

  2. Или изменить тип myList к List<URL>, а затем сделать .toString() вызов внутри onItemClick.

Какой вы идете с зависит от типа вы хотите myList иметь.

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.

+0

Я пробовал это, но получаю ту же ошибку. –

Смежные вопросы