簡體   English   中英

如何從布局xml中顯示Android MediaController?

[英]How can I get an Android MediaController to appear from layout xml?

我已經使用以下XML創建了一個layout.xml文件,但我無法讓MediaController出現。

<MediaController android:id="@+id/media_controller"
    android:layout_width="fill_parent"
    android:layout_height="200px"
    android:visibility="visible"/>

在代碼中,我可以從代碼中獲取對它的引用,調用show()等,但它永遠不會出現。

我注意到在android開發文檔( MediaController.html )中它說,“使用這個類的方法是以編程方式實例化它。”所以也許我是一個dufus並且只需要做一些不同的事情,比如不做我在做什么 :)

如果我以編程方式執行它,我可以讓它出現,但我需要它始終顯示在屏幕上。 我只是愚蠢,還是只是不打算通過XML膨脹?

這個示例項目

ctlr=new MediaController(this);
ctlr.setMediaPlayer(video);
video.setMediaController(ctlr);

然后,當您點擊VideoView底部邊緣的屏幕時,它會出現。

就一直保持在屏幕上而言...我不知道這是否可能。 您始終可以創建自己的控制器 - 這是一個創建自己的彈出式半透明控制器的示例項目 它真的不是那么難,你可以完全控制一切,包括安排它一直在屏幕上。

您可以阻止MediaController隱藏擴展MediaController並覆蓋hide()以不執行任何操作。 例如:

class UnhideableMediaController extends MediaController
{
    // override whichever contstructors you need to. 
    public UnhideableMediaController(Context context)
    {
      super(context);
    }

    // override hide to do nothing
    public void hide()
    {
      // don't hide
    }
}

你可以從布局xml中充氣一個mediacontroller。 在獲得它的參考之后,還可以將視頻視圖設置為錨。

  • 但是,一旦你試圖觸摸mediacontroller,這將導致崩潰(我試圖弄清楚它為什么會發生)。

此外,媒體控制器將始終出現。

<?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"
    android:orientation="vertical" >

    <VideoView
        android:id="@+id/mVideoView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <MediaController
        android:id="@+id/mediaController1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true"
        android:focusable="false"
        android:focusableInTouchMode="false"/>
</RelativeLayout>

在活動中,

public class AnimationActivity extends Activity implements OnClickListener {

    private MediaController mController = null;
    private VideoView mVideoView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animation);
        mController = (MediaController) findViewById(R.id.mediaController1);
        mController.post(new Runnable() {
            @Override
            public void run() {
                mVideoView = (VideoView) findViewById(R.id.mVideoView);
                mVideoView.setVideoURI(Uri.parse("android.resource://"
                        + getPackageName() + "/" + R.raw.video0));
                mController.setAnchorView(mVideoView);
                mVideoView.setSoundEffectsEnabled(false);
                mVideoView.start();
            }
        });
    }
}

通過使用show(0),將顯示媒體控制器,直到通過與玩家的交互調用hide()。 我發現很遺憾沒有辦法阻止hide()呢;-(

MediaController mc = new MediaController(MPlayer.this);  
 mc.setMediaPlayer(MPlayer.this);  
 mc.setEnabled(true);

 View mMediaControllerView = (View)findViewById(R.id.media_controller); //get it from your layout

 mc.setAnchorView(mMediaControllerView);
 mMediaControllerView.setOnTouchListener(mPlayerTouchListener);//also use show() in onTouchListener

 new Handler().postDelayed(new Runnable() {

     public void run() {
        mc.show(0);
     } }, 1500);

等待屏幕buid以避免android中的錯誤(這里1.5秒)

在布局文件中聲明我的MediaController時,在代碼中獲取句柄(使用Activity.findViewById(int id)方法)並將其附加到我的VideoView(使用VideoView.setMediaController(MediaController controller)方法),我發現它有時表現不合需要(強制關閉應用程序)。 相反,我在代碼中創建它,將其附加到VideoView,然后使用VideoView.setAnchorView(View view)方法指定它應在Activity中顯示的位置,如下所示:

myVideoView.setVideoURI(Uri.parse(myVideoUrl));
myVideoView.setOnPreparedListener(new OnPreparedListener()
{
  public void onPrepared(MediaPlayer mp)
  {
    MediaController mediaController = new MediaController(MyActivity.this);
    videoView.setMediaController(mediaController);

    // put the MediaController at the bottom of the Activity rather than directly beneath the VideoView
    // (note that my Activity's layout file has root node with id 'myactivity_layoutroot')
    if (findViewById(R.id.myactivity_layoutroot) != null)
      mediaController.setAnchorView(findViewById(R.id.myactivity_layoutroot));

    videoView.requestFocus();
  }
});
myVideoView.start();

http://www.docstoc.com/docs/9811647/Media-on-the-Android-Platform

本文檔建議您可能需要擴展Controller以獲得所需的行為。

您可以在很長一段時間內展示它我想;)

我現在正努力甚至讓控制器顯示然后按下按鈕:

(也很有趣google如何快速將此問題添加到搜索結果中)

我認為這是你的“mVideoView.setVideoURI”部分。 我最近一直在做類似的事情,包括這個,似乎必須通過服務器檢索視頻。 您需要將視頻存儲在服務器上,然后在此處調用。 無論如何,這就是我發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM