2012-06-16 9 views
5

da ridimensionare il video in superficie vistaAndroid come ridimensionare la larghezza e l'altezza in vista di superficie per il lettore multimediale

sto giocando un video in Media Player con l'utilizzo di una visione superficiale e supporto per il video ..

// ma sull'implementazione di MediaPlayerControl su alcuni dispositivi, Micromax, iball, tablet Akash restituisce un errore del metodo astratto non disponibile come tracciato dal bug tracking ACRA.

Ora voglio avere la soluzione di problemi di cui:

  • Come arrivare lettore multimediale controlli attivi in ​​tutti i dispositivi wihtout schiantarsi a causa di metodo astratto come per il regolatore dei media in alcuni dispositivi.

  • Come è possibile ridimensionare la vista di superficie del video.

Il codice è F9 lavorando su Samsung Galaxy GT P1000 OS 2.2 e qualche dispositivo più economico WorldTeck ecc

Ma ZiiO 7 creativa versione del sistema operativo è 2.2.1 (480 * 800)la densità di risoluzione è 160 dpi il video sembra essere ingrandito e viene rimosso dai bordi.

Il codice è il seguente:

/* 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

provare [la mia risposta] (http://stackoverflow.com/questions/8293909/surfaceview-height-width-gets-igned/20798009#20798009). Può esserti utile. –

risposta

1

Hi arpit Stavo lavorando anche sugli stessi dispositivi come lei ha detto per la riproduzione di file video, I ottenuto lo stesso problema durante l'applicazione dei controlli di lettore video (Metodo astratto non disponibile).

Come per la mia R & D su questo tema vengo a conclusione che il sistema operativo Android personalizzato e l'hardware di questi dispositivi non sono compatibili per l'altro in quanto sono di qualità molto scadente rispetto ai dispositivi Samsung, tanti di metodi sebbene siano nel sistema operativo Android ma non supportati da tali dispositivi.

Quindi penso che non ci siano soluzioni per tali problemi, in questi dispositivi.

plz tenta di concentrarsi su dispositivi standard durante lo sviluppo di qualsiasi progetto. questo può aiutarti molto.

Grazie. :)

2

ho usato TextureView invece di superficie vista (che permette di ruotare video) e impostare il suo setScale {X | Y}() in modo appropriato in:

@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); 
    } 
} 

Nota che ho ruotato il mio video, questo è il motivo per cui ho impostato la scala per X.