Android流m3u无线电在移动数据上失败(g3 /移动数据)

use*_*021 0 android media-player 3g

不太容易解释:

我有这个应用程序流媒体在线广播.问题首先是m3u格式(android在某种程度上通常不能像pls那样流),所以我必须用这个ParserM3UToURL解析url(我找到了某个地方)...像这样:

Uri u = Uri.parse(ParserM3UToURL.parse(STREAM_URL, sdkVersion, c));
player = MediaPlayer.create(c, u);
Run Code Online (Sandbox Code Playgroud)

大多数它工作正常,但它有一个错误......

我正在两个旧设备2.2.2上测试这个.(api等级17),其他4.3(api等级23).旧设备工作正常.它可以通过wifi或移动数据流式传输无线电,但较新的设备在移动数据流上存在一些问题(在wifi上工作正常).应用程序崩溃,因为解析函数返回null:http://pastebin.com/ghbAqGzM

而且我认为有更多的手机4.x而不是2.x android.这当然对我来说非常痛苦.不知怎的,我必须解决这个问题.所以我真的希望有人会对此有所了解.我希望我的解释不要混淆......

这是ParserM3UToURL.parse()函数:

public static String parse(String paramString, int sdkVersion, Context c)
{
    try
    {
      StrictModeWrapper.init(c);
      HttpURLConnection localHttpURLConnection = (HttpURLConnection)new URL(paramString).openConnection();
      InputStream localInputStream = localHttpURLConnection.getInputStream();
      BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localInputStream));
      StringBuffer localStringBuffer = new StringBuffer();
      while (true)
      {
        String str = localBufferedReader.readLine();
        if (str == null)
        {
          localHttpURLConnection.disconnect();
          localBufferedReader.close();
          localInputStream.close();
          break;
        }
        if (str.contains("http"))
        {
          localHttpURLConnection.disconnect();
          localBufferedReader.close();
          localInputStream.close();
          return str;
        }
        localStringBuffer.append(str);
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

Nan*_*tey 5

以下是我用于流式传输(m3Urls)的工作.以下示例使用服务.启动服务时,将解析URL.请注意,在onPostExecute中,已准备好已解析的文件.准备好文件(完成缓冲)后,文件将在完成时播放/启动并停止.

  public class BackgroundRadioService extends Service implements
        OnCompletionListener, OnPreparedListener{
     MediaPlayer mediaPlayer;


@Override
public void onCreate() {

    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnCompletionListener(this);
    mediaPlayer.setOnPreparedListener(this);
Run Code Online (Sandbox Code Playgroud)

}

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
              parseM3uUrlAndPrepare("http://listen.radionomy.com/andalousse.m3u");
    return START_STICKY;
    }



  private void parseM3uUrlAndPrepare(final String url){

AsyncTask<String, Integer, String> asyn = new  AsyncTask<String, Integer, String>(){

        HttpClient httpClient;
        HttpGet getRequest;
        HttpResponse httpResponse = null;
        String filePath = "";

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                 httpClient = new DefaultHttpClient();


                    getRequest = new HttpGet(url);

            }

        @Override
        protected String doInBackground(String... params) {

                try {
                    httpResponse = httpClient.execute(getRequest);
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if(httpResponse != null)
                if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
                    // ERROR MESSAGE


                } else {
                    InputStream inputStream = null;
                    try {
                        inputStream = httpResponse.getEntity().getContent();
                    } catch (IllegalStateException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } 
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    String line;
                    try {
                        while ((line = bufferedReader.readLine()) != null) {
                            //Log.v("PLAYLISTLINE", "ORIG: " + line);
                            if (line.startsWith("#")) { // Metadata

                            } else if (line.length() > 0) {
                                filePath = "";

                                if (line.startsWith("http://")) { // Assume it's a full URL
                                    filePath = line;
                                } else { // Assume it's relative
                                    try{
                                    filePath = getRequest.getURI().resolve(line).toString();
                                    }catch(IllegalArgumentException e){

                                    }catch(Exception e){

                                    }
                                }


                            }
                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            return filePath;
        }

        @Override
        protected void onPostExecute(String filePath) {
            try {
            mediaPlayer.setDataSource(filePath);
            mediaPlayer.prepareAsync(); //this will prepare file a.k.a buffering

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        }
    };          
        asyn.execute("");
Run Code Online (Sandbox Code Playgroud)

}

@Override
        public void onPrepared(MediaPlayer mp) {
            // TODO Auto-generated method stub      
            mediaPlayer.start();    
}

@Override
    public void onCompletion(MediaPlayer mp) {  
        mediaPlayer.stop();
      }

}//end of Service class declaration
Run Code Online (Sandbox Code Playgroud)

注意:这会忽略播放列表,因此假设解析的m3u将只返回一个文件.如果您想处理播放列表,请告诉我,以便修改我的答案:)