2015-01-13 77 views
1

我尝试构建可在同一时间下载和播放歌曲的Android在线音乐播放器,并且用户可以在下载时间(完成下载前)听到音乐。 我使用下面的下载类和MediaPlayer启动音乐,但这个类只是在下载完成时工作,如果用户点击播放之前完成下载应用程序与NullpointExption坠毁有什么解决方案......!Android在线音乐播放器

下载类(简历能):

public class downloader { 
private static boolean Stopdownloader = false;//use for stop download 


public static void Stop(boolean status) { 
    Stopdownloader = status; 
} 


public static void dl(final String downloadPath, final String filePath, final Ondownloadprogress lisener) { 
    Thread thread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       int downloadedSize = 0; 
       int fileLength = 0; 
       URL url = new URL(downloadPath); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       File file = new File(filePath); 
       if (file.exists()) { 
        connection.setRequestProperty("Range", "bytes=" + file.length() + "-"); 
        downloadedSize = (int) file.length(); 
       } 
       connection.setRequestMethod("GET"); 
       connection.setDoInput(true); 
       final int FILE_SIZE = connection.getContentLength(); 
       connection.connect(); 
       fileLength = connection.getContentLength() + downloadedSize; 
       BufferedInputStream input = new BufferedInputStream(connection.getInputStream()); 
       RandomAccessFile output = new RandomAccessFile(file, "rw"); 
       output.seek(downloadedSize); 

       byte data[] = new byte[1024]; 
       int count = 0; 
       int progress = 0; 

       while ((count = input.read(data, 0, 1024)) != -1 
         && progress != 100) 
       { 
        if (Stopdownloader) { 
         break; 
        } 
        downloadedSize += count; 
        output.write(data, 0, count); 
        progress = (int) ((downloadedSize * 100)/fileLength); 
        final int ss = (int) ((downloadedSize * 100)/fileLength); 
        final float persent = ((float) progress/FILE_SIZE) * 100; 
        if (lisener != null) { 
         final int finalProgres = progress; 
         G.HANDLER.post(new Runnable() { 

          @Override 
          public void run() { 
           lisener.ondownload((int) ss, finalProgres, FILE_SIZE); 
          } 
         }); 

        } 
       } 

       output.close(); 
       input.close(); 
      } 
      catch (MalformedURLException e) {} 
      catch (IOException e) {} 
      finally {} 
     } 
    }); 

    thread.start(); 

}} 

,并在MainActivity:

play.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      downloader.dl("http://MUSIC-URL","/temp.mp3", null); 
      downloader.Stop(false); 
      MediaPlayer Music = MediaPlayer.create(G.context, Uri.parse("/temp.mp3")); 
      Music.start(); 
      Music.prepare(); 
     } 
    }); 
+0

是“/temp.mp3”'有效的文件路径? –

+0

是的,文件创建和有效,当下载完成mediaplayer开始正确,但我尝试播放音乐和下载文件在同一时间 – Saman

回答

0

您需要的start()

Android的参考是之前做的准备()写得不错:http://developer.android.com/reference/android/media/MediaPlayer.html

然后看看这个tuto rial,http://sapandiwakar.in/tutorial-how-to-manually-create-android-media-player-controls/,我认为它应该让你感觉一点。

+0

感谢您的答案,但如果准备()之前开始()媒体首先下载完成然后播放,但我尝试播放完成之前的音乐文件... – Saman