2012-06-16 35 views
5

要調整大小的視頻表面觀機器人如何調整視頻的寬度和高度表面觀爲媒體播放器

我在玩的媒體播放器的視頻使用視頻從表面上看和持有人..

//但是在某些設備上實現MediaPlayerControl時,Micromax,iball,Akash平板電腦給出的抽象方法的錯誤不能通過ACRA錯誤跟蹤進行跟蹤。

現在我希望有上述問題的解決方案:

  • 如何獲得活躍在wihtout崩潰所有設備的媒體播放器控件由於抽象方法,在某些 設備媒體控制器。

  • 如何調整視頻的表面視圖大小。

的代碼上三星Galaxy GT P1000 OS 2.2和一些便宜的設備WorldTeck等工作F9

但在創意ziio 7 OS版本2.2.1(480×800)分辨率密度是160 dpi視頻似乎被放大並從邊緣切斷。

的代碼如下所示:

/* Media Player Control is commented due to force close in some devices say *micromax,Creative ziio, akash etc */ 

    public class VideoViewerActivity extends Activity implements 
      OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, 
      OnVideoSizeChangedListener, SurfaceHolder.Callback { 
     // implements ERROR in some devices , MediaPlayerControl 
     private static final String TAG = "MediaPlayerDemo"; 
     private int mVideoWidth; 
     private int mVideoHeight; 
     private MediaPlayer mMediaPlayer; 
     private SurfaceView mPreview; 
     private SurfaceHolder holder; 
     private String path = ""; 
     private Bundle extras; 
     private static final String MEDIA = "media"; 
     private static final int LOCAL_AUDIO = 1; 
     private static final int STREAM_AUDIO = 2; 
     private static final int RESOURCES_AUDIO = 3; 
     private static final int LOCAL_VIDEO = 4; 
     private static final int STREAM_VIDEO = 5; 
     private boolean mIsVideoSizeKnown = false; 
     private boolean mIsVideoReadyToBePlayed = false; 
     /* ERROR In Abstract method implementation in the other devices */ 
     // private MediaController mediaController; 
     private Context context; 
     private final Handler handler = new Handler(); 

     /** 
     * 
     * Called when the activity is first created. 
     */ 
     @Override 
     public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      setContentView(R.layout.video_layout); 
      context = this; 
      path = getIntent().getExtras().getString("media"); 

      Log.v("arpit", "path " + path); 
      mPreview = (SurfaceView) findViewById(R.id.surfaceview1); 
      holder = mPreview.getHolder(); 
      holder.addCallback(this); 
      holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      extras = getIntent().getExtras(); 

     } 

     private void playVideo() { 
      doCleanUp(); 
      try { 

       // Create a new media player and set the listeners 
       File f = new File(path); 
       // FileInputStream in = new FileInputStream(f); 

       RandomAccessFile randomAccessFile = new RandomAccessFile(f, "r"); 
       // randomAccessFile.skipBytes(1024); 
       FileDescriptor fileDescriptor = randomAccessFile.getFD(); 

       mMediaPlayer = new MediaPlayer(); 
       mMediaPlayer.setDataSource(fileDescriptor, Constant.key1.length 
         + Data.deviceID.length(), f.length()); 

       mMediaPlayer.setDisplay(holder); 
       mMediaPlayer.prepare(); 
       mMediaPlayer.setOnBufferingUpdateListener(this); 
       mMediaPlayer.setOnCompletionListener(this); 
       mMediaPlayer.setOnPreparedListener(this); 
       mMediaPlayer.setOnVideoSizeChangedListener(this); 
       mMediaPlayer.setScreenOnWhilePlaying(true); 

       // mediaController = new MediaController(this); 
       mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

      } catch (Exception e) { 
       Log.e(TAG, "error: " + e.getMessage(), e); 
       Toast.makeText(context, "supported video was not found", 
         Toast.LENGTH_SHORT).show(); 
       finish(); 
      } 
     } 

     public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { 
      Log.v(TAG, "onVideoSizeChanged called"); 
      if (width == 0 || height == 0) { 
       Log.e(TAG, "invalid video width(" + width + ") or height(" + height 
         + ")"); 
       return; 
      } 
      mIsVideoSizeKnown = true; 
      mVideoWidth = width; 
      mVideoHeight = height; 
      if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { 
       startVideoPlayback(); 
      } 
     } 


     public void surfaceDestroyed(SurfaceHolder surfaceholder) { 
      Log.d(TAG, "surfaceDestroyed called"); 
     } 

     public void surfaceCreated(SurfaceHolder holder) { 
      Log.d(TAG, "surfaceCreated called"); 
      playVideo(); 

     } 

     private void doCleanUp() { 
      mVideoWidth = 0; 
      mVideoHeight = 0; 
      mIsVideoReadyToBePlayed = false; 
      mIsVideoSizeKnown = false; 
     } 

     private void startVideoPlayback() { 
      Log.v(TAG, "startVideoPlayback"); 
//also tried and used the below line but nothing good 


// holder.setFixedSize(480, 800); 

holder.setFixedSize(mVideoWidth, mVideoHeight); 

mMediaPlayer.start(); 

     } 


    } 
+0

試試[我​​的答案](http://stackoverflow.com/questions/8293909/surfaceview-height-width-gets-ignored/20798009#20798009)。可以這會幫助你。 –

回答

1

嗨arpit我也是在相同的設備上工作,你所提到的用於播放視頻文件, 我爲應用控制視頻播放器得到了同樣的問題(抽象方法不可用)。

按照有關這個主題的我 - [R & d我要得出這樣的結論定製的Android操作系統和這些設備的硬件不兼容對方,因爲它們質量很差相比,三星的設備, 這麼多雖然他們在Android操作系統但不支持這些設備的方法。

所以我認爲這些設備中沒有解決這些問題的方案。

plz嘗試在開發任何項目時使用標準設備進行關注。這可能會幫助你很多。

謝謝。 :)

2

我用來代替面視圖TextureView(它允許旋轉視頻),並設置其setScale {X | Y}()適當:

@Override 
public void onVideoSizeChanged(MediaPlayer mp, int w, int h) { 
    if (w > 0 && h > 0) { 
     RelativeLayout.LayoutParams l; 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     l = new RelativeLayout.LayoutParams(metrics.heightPixels, metrics.widthPixels); 
     l.addRule(RelativeLayout.CENTER_IN_PARENT, -1); 
     float scale = (metrics.heightPixels * 1.0f)/(metrics.widthPixels * 1.0f); 
     videoView.setScaleX(scale); 
     videoView.setLayoutParams(l); 
     Log.d(YourApp.TAG, "video size: " + mp.getVideoWidth() + "x" + mp.getVideoHeight() + " vertical scale: " + scale); 
    } 
} 

注意,我旋轉我的視頻,這這就是爲什麼我設置X的比例。

相關問題