2015-08-24 8 views
8

हाय मैं वीडियो फ़ाइल से बनाई गई पृष्ठभूमि के साथ एक गतिविधि प्राप्त करने की कोशिश कर रहा हूं। नीचे पोस्ट किया गया समाधान नेक्सस 6 एंड्रॉइड 5.1 को छोड़कर अधिकांश उपकरणों पर काम कर रहा है। वीडियो काम कर रहा है, स्केल किया गया है लेकिन फसल नहीं है, इसलिए पहलू अनुपात संरक्षित नहीं है। लेआउट फ़ाइल हैनेक्सस 6 और मीडियाप्लेयर। VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback, OnClickListener 
{ 
    private static final int VIDEO_START_HACK_DELAY = 0; 

    private static final String BG_VIDEO_PATH = "/raw/construction"; 
    private SurfaceView mSurface; 

    private Button mTour, mLogin; 

    private MediaPlayer mMediaPlayer; 

    private Handler mHandler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_start_main); 
     setupUI(); 
    } 

    private void setupUI() 
    { 
     mMediaPlayer = new MediaPlayer(); 
     mSurface = (SurfaceView) findViewById(R.id.surface); 
     SurfaceHolder holder = mSurface.getHolder(); 
     holder.addCallback(this); 

     mTour = (Button) findViewById(R.id.tour); 
     mLogin = (Button) findViewById(R.id.login); 

     mTour.setOnClickListener(this); 
     mLogin.setOnClickListener(this); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     startVideo(holder); 
    } 

    @SuppressLint("NewApi") 
    public void startVideo(SurfaceHolder holder) 
    { 
     String path = "android.resource://" + getPackageName() + BG_VIDEO_PATH; 
     Uri uri = Uri.parse(path); 

     try 
     { 
      android.view.ViewGroup.LayoutParams lp = mSurface.getLayoutParams(); 
      mMediaPlayer.setDisplay(holder); 
      mMediaPlayer.setDataSource(this, uri); 
      mMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); 
      mMediaPlayer.setLooping(true); 
      mMediaPlayer.setOnPreparedListener(new OnPreparedListener() 
      { 

       @Override 
       public void onPrepared(MediaPlayer mp) 
       { 
        mHandler.postDelayed(new Runnable() 
        { 

         @Override 
         public void run() 
         { 
          mMediaPlayer.start(); 
         } 
        }, VIDEO_START_HACK_DELAY); 

       } 
      }); 
      mMediaPlayer.prepareAsync(); 
     } 
     catch (Exception e) 
     { 
      Log.e("VID", "Problem starting video bg", e); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onBackPressed() 
    { 
     mSurface.setVisibility(View.INVISIBLE); 
     mMediaPlayer.stop(); 
     super.onBackPressed(); 
    } 

    @Override 
    protected void onDestroy() 
    { 
     mMediaPlayer.stop(); 
     mMediaPlayer.release(); 
     super.onDestroy(); 
    } 
} 

यहाँ:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <SurfaceView 
     android:id="@+id/surface" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_marginBottom="40dp" 
     android:gravity="center" 
     android:orientation="vertical" > 

     <Button 
      android:id="@+id/tour" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" 
      android:padding="10dp" 
      android:text="@string/ma_tour"/> 

     <Button 
      android:id="@+id/login" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:padding="10dp" 
      android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" 
      android:text="@string/ma_log_in"/> 

    </LinearLayout> 

</RelativeLayout> 

लक्ष्य एसडीके है

गैलेक्सी नोट के साथ परीक्षण किया गया, HTC One M7, एक्सपीरिया जेड 3, नेक्सस 5.

यहाँ कोड है 22 पर सेट करें। क्या आपने शायद ऐसा व्यवहार अनुभव किया है और कोई सलाह दे सकते हैं?

+1

ही समस्या का सामना करना पड़ रहा। क्या आपको समाधान मिला है? – Grecha

उत्तर

0

यहाँ है कैसे मैं इसे अपने अनुप्रयोगों में से एक में किया था:

  1. MediaPlayer वस्तु पर OnPreparedListener सेट करें।

    mediaPlayer.setOnPreparedListener (यह);

  2. जब public void onPrepared(MediaPlayer mp) कहा जाता है, तो SurfaceView का आकार बदलें ताकि यह फसल वाले वीडियो का भ्रम पैदा कर सके। Log.v (LOG_TAG, "ऑनपेरडेड मीडियाप्लेयर के लिए बुलाया गया"); // वीडियो के आकार को समायोजित करें ताकि यह स्क्रीन int videoWidth = mInitialVideoPlayer.getVideoWidth() पर फिट बैठता है; int videoHeight = mInitialVideoPlayer.getVideoHeight(); फ्लोट वीडियोप्रणाली = (फ्लोट) वीडियोविड्थ/(फ्लोट) वीडियो हाइट;

    ViewGroup.LayoutParams lp = mSplashVideoSurfaceView.getLayoutParams(); 
    
    // We always want to fill entire view port. So, we keep the smallest dimension and proportionately 
    // scale the other dimension. 
    if (videoWidth < videoHeight) { 
        lp.width = UiUtils.sScreenWidth; 
        lp.height = (int) ((float) UiUtils.sScreenWidth/videoProportion); 
    } else { 
        lp.width = (int) (videoProportion * (float) UiUtils.sScreenHeight);If you are targetting API level 14 and above, <code>TextureView</code> allows you to play cropped video 
        lp.height = UiUtils.sScreenHeight; 
    } 
    Log.v(LOG_TAG, "old video size: " + videoWidth + ", " + videoHeight); 
    Log.v(LOG_TAG, "screen size: " + UiUtils.sScreenWidth + ", " + UiUtils.sScreenHeight); 
    Log.v(LOG_TAG, "new video size: " + lp.width + ", " + lp.height); 
    mSplashVideoSurfaceView.setLayoutParams(lp); 
    
संबंधित मुद्दे