2016-06-13 1 views
0

서버에서 비디오 경로를 가져 와서 surfaceView를 사용하여 재생하고 싶습니다.onCreate()에서 대신 SurfaceView addCallback()을 사용하십시오.

다른 활동 클래스를 사용하여 수신 된 경로 이후에 비디오를 재생할 수 있습니다. 그러나 나는 같은 활동을하고있다.

AsyncTask를 사용하여 백그라운드에서 경로를 얻고 있습니다. 이 AsyncTask는 onCreate() 메소드에서 실행됩니다. onPostExecute()에서 경로를 얻은 후 SurfaceView에서 비디오를 재생하고 싶습니다.

그러나 SurfaceView는 해당 경로를 받기 전에 만들어집니다. 그래서 onPostExecute()에서 SurfaceView의 addCallback()을 사용하려고했습니다. 그러나 그것은 가능하지 않습니다.

어떻게하면됩니까? SurfaceView를 사용하면 서버에서 리소스 경로를 가져온 후 동일한 활동으로 비디오를 재생할 방법이 없습니까?

+0

당신은 활동 코드를 보일 수 있는가? –

+0

@ChintanSoni, 감사합니다. 그러나 몇 가지 테스트를 거친 후에 해결책을 찾았습니다. 나는 그것이 나 같은 사람을 도울 수 있도록이 답변으로 게시 할 것입니다. –

답변

0

오, 예, 해결책을 찾았습니다. 나는 그것이 나 같은 사람에게 도움이 될 수 있도록 여기에 올릴 것입니다. 어디서나이 문제에 대한 해결책을 확인했기 때문에이 방법을 따르지 않았습니다.

귀하의 활동 클래스

는 :

public class PlayActivity extends AppCompatActivity implements SurfaceHolder.Callback { 
    private SurfaceHolder sh; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_play); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     //getResource is your AsyncTask 
     //I will not post it here because it is not the problem we had 
     getResource _gR = new attemptGetStream(p1, p2); 
     _gR.execute(); 

     //initiate components 
     SurfaceView sV = (SurfaceView) findViewById(R.id.main); 
     assert null != sV : "Surface is null"; 
     sV.getHolder().addCallback(this); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder sHolder) { 
     //this is the solution. 
     //only assign holder to a variable but don’t initiate MediaPlayer here 
     //because we don’t have resource paths yet 
     //we will initiate MediaPlayer in postExecute method and 
     //attach to this holder from there 
     sh = sHolder; 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { 
     log("Surface changed"); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     log("Surface destroyed"); 
    } 

    //this is our method called from onPostExecute() in our getResource AsyncTask 
    public void play(String path){ 
     //here initiate the MediaPlayer and assign dataSource 
     //attach the player to sh(which is our surface holder 
     try{ 
      MediaPlayer mMediaPlayer = new MediaPlayer(); 
      mMediaPlayer.setDisplay(sh);//sh is the surface holder 
      mMediaPlayer.setDataSource(getApplicationContext(), path);//path is what we got from onPostExecute method in AsyncTask 

      mMediaPlayer.prepareAsync();//i use prepareAsync method here so it will not hog the phone 
      mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) { 
        mP.start(); 
       } 
      }); 
     }catch (Exception e){//use exception types as you like 
      e.printStackTrace(); 
     } 
    } 


}