마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

http오디오스트리밍하려는데 쇼트되는 이유가 뭘까요?ㅜㅠ

0 추천

http오디오스트리밍을 구현하려고 합니다. 일단 logcat에 뜨는 건

05-07 03:13:52.786: V/URI(6092): http://live.kboo.fm:8000/high.m3u
05-07 03:13:52.816: D/AndroidRuntime(6092): Shutting down VM
05-07 03:13:52.816: W/dalvikvm(6092): threadid=1: thread exiting with uncaught exception (group=0x40c401f8)
05-07 03:13:52.826: E/AndroidRuntime(6092): FATAL EXCEPTION: main
05-07 03:13:52.826: E/AndroidRuntime(6092): android.os.NetworkOnMainThreadException
05-07 03:13:52.826: E/AndroidRuntime(6092):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at com.example.streamaudio.MainActivity.parsePlaylistFile(MainActivity.java:168)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at com.example.streamaudio.MainActivity.access$0(MainActivity.java:158)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at com.example.streamaudio.MainActivity$1.onClick(MainActivity.java:55)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at android.view.View.performClick(View.java:3620)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at android.view.View$PerformClick.run(View.java:14322)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at android.os.Handler.handleCallback(Handler.java:605)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at android.os.Handler.dispatchMessage(Handler.java:92)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at android.os.Looper.loop(Looper.java:137)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at android.app.ActivityThread.main(ActivityThread.java:4507)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at java.lang.reflect.Method.invokeNative(Native Method)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at java.lang.reflect.Method.invoke(Method.java:511)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at dalvik.system.NativeStart.main(Native Method)
와 같이 뜹니다. 매니페스트에서 permission주었습니다.

아래는 main소스입니다. 뭐가 문제인지 고수님들 답변바랍니다....ㅠㅜ

 

wonie86 (300 포인트) 님이 2013년 5월 7일 질문
package com.example.streamaudio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Vector;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity{

    Vector playlistItems;
    Button ParseButton;
    Button PlayButton;
    Button StopButton;
    EditText editTextUrl;
    String baseURL = "";
    MediaPlayer mediaplayer;
   
    int currentPlaylistItemNumber = 0;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ParseButton = (Button)findViewById(R.id.parse);
        PlayButton = (Button)findViewById(R.id.play);
        StopButton = (Button)findViewById(R.id.stop);
        editTextUrl = (EditText)this.findViewById(R.id.edittexturl);
        editTextUrl.setText("http://live.kboo.fm:8000/high.m3u");
        
        ParseButton.setOnClickListener(new OnClickListener() {
           
            public void onClick(View v) {
                // TODO Auto-generated method stub
                parsePlaylistFile();
               
            }
        });
           
        PlayButton.setOnClickListener(new OnClickListener() {
           
            public void onClick(View v) {
                // TODO Auto-generated method stub
                playPlaylistItem();
               
            }
        });
        
        StopButton.setOnClickListener(new OnClickListener() {
           
            public void onClick(View v) {
                // TODO Auto-generated method stub
                stop();
               
            }
        });
        
        PlayButton.setEnabled(false);
        StopButton.setEnabled(false);
        
        mediaplayer = new MediaPlayer();
        mediaplayer.setOnCompletionListener(new OnCompletionListener() {
           
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                Log.v("ONCOMPLETE", "called");
                mp.stop();
                mp.reset();
                if(playlistItems.size() > currentPlaylistItemNumber + 1){
                    currentPlaylistItemNumber++;
                    String path = ((PlaylistFile)playlistItems.get(currentPlaylistItemNumber)).getFilePath();
                    try{
                        mediaplayer.setDataSource(path);
                        mediaplayer.prepareAsync();
                    }catch(IllegalArgumentException e){
                        e.printStackTrace();
                    }catch(IllegalStateException e){
                        e.printStackTrace();
                    }catch (IOException e) {
                        e.printStackTrace();
                        // TODO: handle exception
                    }
                }
               
            }
        });
        mediaplayer.setOnPreparedListener(new OnPreparedListener() {
           
            public void onPrepared(MediaPlayer mp) {
                // TODO Auto-generated method stub
                StopButton.setEnabled(true);
                Log.v("HTTPAUDIOPLAYLIST","Playing");
                mp.start();
               
            }
        });
    }
    


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


    private void stop() {
        // TODO Auto-generated method stub
        mediaplayer.pause();
        PlayButton.setEnabled(true);
        StopButton.setEnabled(false);
       
    }

    private void playPlaylistItem() {
        // TODO Auto-generated method stub
        PlayButton.setEnabled(false);
        currentPlaylistItemNumber = 0;
        if(playlistItems.size() > 0){
            String path = ((PlaylistFile)playlistItems.get(currentPlaylistItemNumber)).getFilePath();
            try{
                mediaplayer.setDataSource(path);
                mediaplayer.prepareAsync();
            }catch(IllegalArgumentException e){
                e.printStackTrace();
            }catch(IllegalStateException e){
                e.printStackTrace();
            }catch (IOException e) {
                e.printStackTrace();
                // TODO: handle exception
            }
        }
       
        }
   

    private void parsePlaylistFile() {
        // TODO Auto-generated method stub
playlistItems = new Vector();
       
        HttpClient httpClient =  new DefaultHttpClient();
        HttpGet getRequest =  new HttpGet(editTextUrl.getText().toString());
       
        Log.v("URI", getRequest.getURI().toString());
       
        try{
            HttpResponse httpResponse = httpClient.execute(getRequest);
            if(httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK){
                Log.v("HTTP ERROR", httpResponse.getStatusLine().getReasonPhrase());
            }else{
                InputStream inputStream = httpResponse.getEntity().getContent();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
               
                String line;
                while((line = bufferedReader.readLine()) != null){
                    Log.v("PLAYLISTLINE", "ORIG: " + line);
                   
                    if(line.startsWith("#")){
                       
                    }else if(line.length() > 0){
                        String filepath = "";
                       
                        if(line.startsWith("http://")){
                            filepath = line;
                        }else{
                            filepath = getRequest.getURI().resolve(line).toString();
                        }
                        PlaylistFile playlistFile = new PlaylistFile(filepath);
                        playlistItems.add(playlistFile);
                    }
                }
                inputStream.close();
            }
        }catch (ClientProtocolException e) {
                // TODO: handle exception
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
            PlayButton.setEnabled(true);
    }
    class PlaylistFile{
        String filePath;
       
        public PlaylistFile(String _filePath){
            filePath = _filePath;
        }
       
        public void setFilePath(String _filePath){
            filePath = _filePath;
        }
       
        public String getFilePath(){
            return filePath;
        }
    }
}

2개의 답변

0 추천

Fatal Execption 다음에 나오는

NetworkOnmainthreadException 이라는 것만 봐도~

알수있을꺼에요~

익셉션이 뜨면

자기 소스와 관련된 부분

05-07 03:13:52.826: E/AndroidRuntime(6092):  at com.example.streamaudio.MainActivity.parsePlaylistFile(MainActivity.java:168)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at com.example.streamaudio.MainActivity.access$0(MainActivity.java:158)
05-07 03:13:52.826: E/AndroidRuntime(6092):  at com.example.streamaudio.MainActivity$1.onClick(MainActivity.java:55)

 

요런 부분 부터 찾아서 해결해보시고 안되면

 

상단의 익셉션 이름으로 검색을 해서 해결해 가는게 도움이 되실껍니다~

 

SGLEE (1,690 포인트) 님이 2013년 5월 7일 답변
0 추천

에러의 원인을 살펴 보시면 NetworkOnmainthreadException이라고 발생을 하고 있군요...

주요 원인은 허니컴 이후 Main thread에서 network과 같은 비확실한 작업들을 Main Thread에서 동작하는 것을 금기하고 있습니다.

그럼 여기서 두가지 선택의 기로가 나뉘게 됩니다.

1. 아 ~ 난 이코드 때려 죽여도 그대로 쓰고 시퍼~

이런 경우 OS 버전을 낮춰 빌드 해보세요...

단, 이렇게 되면 상위 API가 사용을 할수 없다는 단점이 생기겠죠...

2. 근본적인 이런 해결방법은 별도의 Thread에서 동작시켜 주는 것입니다.

에러의 주요 원인을 살펴보면 parsePlaylistFile() 동작시켜주는 내부적인 코드들은 죄다 HTTP 통신을 하는 구간이죠...

이 구간을 별도의 Thread 또는 AsyncTask 등으로 별도의 작업을 해주시면

원하는 결과를 얻으실수 있을 것입니다.

천상룡섬 (400 포인트) 님이 2013년 5월 7일 답변
아 감사합니다 ^^ 해결의 실마리가 보이네요 정말 감사합니다.
...