Pertanyaan Perilaku Aneh - VideoViewer Fragmen tidak berfungsi dengan MediaController


Saya mencoba membuat fragmen VideoViewer. Di bawah ini adalah 2 kasus yang saya coba dan pengamatannya. Untuk kedua kasus, tampilan fragmen meningkat dari tata letak berikut:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" 
android:layout_height="match_parent"
android:gravity="center">

<VideoView android:id="@+id/fragment_video_viewer_video"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center" />
</RelativeLayout>

Kasus 1: VideoView tanpa pengontrol media -  bekerja dengan baik. Di bawah ini adalah kode untuk onActivityCreated metode

/* Initialize the variables here, retrieve views and  */
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // Assignment for the local variables
    mVideoView = (VideoView) getView().findViewById(R.id.fragment_video_viewer_video);
    mVideoView.setVideoPath("/sdcard/family_guy_test.3gp");//(videoUri);
    mVideoView.requestFocus();
    mVideoView.start();
}

Kasus 2: VideoView dengan pengontrol media -  App Crash ketika saya menyentuh pada VideoView. Di bawah ini adalah kode untuk onActivityCreated metode

/* Initialize the variables here, retrieve views and  */
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // Assignment for the local variables
    mVideoView = (VideoView) getView().findViewById(R.id.fragment_video_viewer_video);
    mVideoView.setVideoPath("/sdcard/family_guy_test.3gp");//(videoUri);
    MediaController mediaController = new MediaController(getActivity().getApplicationContext());
    mediaController.setAnchorView(mVideoView);
    mVideoView.setMediaController(mediaController);
    mVideoView.requestFocus();
}

Output logcat diberikan di bawah ini:

WARN/WindowManager(124): Failed looking up window
WARN/WindowManager(124): java.lang.IllegalArgumentException: Requested window null does not exist
WARN/WindowManager(124):     at com.android.server.WindowManagerService.windowForClientLocked(WindowManagerService.java:9398)
WARN/WindowManager(124):     at com.android.server.WindowManagerService.addWindow(WindowManagerService.java:1906)
WARN/WindowManager(124):     at com.android.server.WindowManagerService$Session.add(WindowManagerService.java:6876)
WARN/WindowManager(124):     at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:66)
WARN/WindowManager(124):     at com.android.server.WindowManagerService$Session.onTransact(WindowManagerService.java:6848)
WARN/WindowManager(124):     at android.os.Binder.execTransact(Binder.java:288)
WARN/WindowManager(124):     at dalvik.system.NativeStart.run(Native Method)
WARN/WindowManager(124): Attempted to add window with token that is not a window: null.  Aborting.
WARN/dalvikvm(8144): threadid=1: thread exiting with uncaught exception (group=0x400287f0)
ERROR/AndroidRuntime(8144): FATAL EXCEPTION: main
ERROR/AndroidRuntime(8144): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
ERROR/AndroidRuntime(8144):     at android.view.ViewRoot.setView(ViewRoot.java:505)
ERROR/AndroidRuntime(8144):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
ERROR/AndroidRuntime(8144):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
ERROR/AndroidRuntime(8144):     at android.widget.MediaController.show(MediaController.java:304)
ERROR/AndroidRuntime(8144):     at android.widget.MediaController.show(MediaController.java:249)
ERROR/AndroidRuntime(8144):     at android.widget.VideoView.toggleMediaControlsVisiblity(VideoView.java:567)
ERROR/AndroidRuntime(8144):     at android.widget.VideoView.onTouchEvent(VideoView.java:518)
ERROR/AndroidRuntime(8144):     at android.view.View.dispatchTouchEvent(View.java:3766)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
ERROR/AndroidRuntime(8144):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
ERROR/AndroidRuntime(8144):     at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
ERROR/AndroidRuntime(8144):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR/AndroidRuntime(8144):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
ERROR/AndroidRuntime(8144):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
ERROR/AndroidRuntime(8144):     at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
ERROR/AndroidRuntime(8144):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
ERROR/AndroidRuntime(8144):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
ERROR/AndroidRuntime(8144):     at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(8144):     at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(8144):     at android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR/AndroidRuntime(8144):     at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(8144):     at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(8144):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
ERROR/AndroidRuntime(8144):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/AndroidRuntime(8144):     at dalvik.system.NativeStart.main(Native Method)
WARN/ActivityManager(124):   Force finishing activity com.comp.ias/.MainActivity
WARN/ActivityManager(124): Activity pause timeout for HistoryRecord{43f755b0 com.comp.ias/.MainActivity}
WARN/WindowManager(124): No window to dispatch pointer action 1

8
2018-06-22 17:52


asal


Jawaban:


Saya tahu bahwa masalahnya sebenarnya dalam konteks yang saya gunakan. Saya harus menggunakan, konteks Kegiatan bukan konteks aplikasi. Lebih khusus lagi, saya harus melakukan:

MediaController mediaController = new MediaController(getActivity());

Dokumentasi tentang kapan menggunakan konteks yang sangat jarang. Terkadang, konteks apa pun bisa digunakan. Terkadang, kita perlu menggunakan konteks tertentu. Saya pikir intuisi di balik penggunaan konteks adalah bahwa, "jika sebuah instance dari suatu kelas diikat ke suatu aktivitas, gunakan konteks aktivitas, yang lain gunakan konteks aplikasi".


22
2017-10-12 03:50