2016-12-06 129 views
0

我需要帮助,解决Android中的VideoView问题。我已经尝试了一切,甚至查看了stackoverflow的问题,但没有人有这个确切的问题。videoView不显示任何东西

问题: 观应该显示从图库中挑选视频(该操作是由一个按钮触发),但即使没有错误日志中和URI不为空没有什么是在视图中显示。所有这些都在ViewPagerFragment之内。 (如果看一下下面的代码,该Log.d("FragCamera", "I_REQUEST_VIDEO_PICK mediaUri : " + mediaUri);运行和mediaUri不null。因此,我不知道还有什么可能是问题。)

顺便说一句,我使用的是棉花糖真实设备用USB来测试这个调试功能,应用程序设置为JellyBean及以上。我不认为这是一个权限问题,因为在同一页面我有代码使用相同的权限,它工作正常。

有谁能告诉我为什么我不能让它工作?

===================================

这是我的代码。它已被剥离为触发此问题的基本代码。 checkPermission()是一种检查和请求运行时权限的方法,并且它可以正常工作,因为使用此功能和相同权限的其他代码工作正常。

fragment_camera_action.xml

<VideoView 
    android:id="@+id/preview_up_vid" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center"/> 

fragment.java

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.fragment_camera_action, container, false); 

    uploadedVid = (VideoView) v.findViewById(R.id.preview_up_vid); 
    btn_getvid = (Button) v.findViewById(R.id.btn_getvid); 

    MediaController mediaController = new MediaController(ctx); 
    mediaController.setAnchorView(uploadedVid); 
    uploadedVid.setMediaController(mediaController); 

    btn_getvid.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Log.d("FragCamera", "btn_getvid on click."); 

      String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}; 

      if (checkMPermission(ctx, permissions, P_REQUEST_PICK_VIDEO)) { 
       pickVideo(); 
      } 
     } 
    }); 

    return v; 
} 

private void pickVideo() { 
    Log.d("FragCamera", "pickVideo()"); 
    Intent pickPictureIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    pickPictureIntent.setType("video/*"); 
    this.startActivityForResult(Intent.createChooser(pickPictureIntent, "Select Video"), I_REQUEST_VIDEO_PICK); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    Log.d("FragCamera", "onActivityResult()"); 

    Uri mediaUri; 

    if (resultCode == RESULT_OK) { 

     switch (requestCode) { 
      case I_REQUEST_VIDEO_PICK: 
       uploadedVid.setVisibility(View.VISIBLE); 

       Log.d("FragCamera", "pickVideo() RESULT_OK"); 

       if (data != null) { 
        mediaUri = data.getData(); 
        Log.d("FragCamera", "I_REQUEST_VIDEO_PICK mediaUri : " + mediaUri); 

        uploadedVid.setVideoURI(mediaUri); 
        uploadedVid.setZOrderOnTop(true); 
        uploadedVid.start(); 

       } 
       break; 
      default: 
       break; 
     } 

    } 
} 
+0

你可以显示你的uri吗? –

+0

@VivekMishra好的,我可以从日志中给出mediaUri的正确(实际)值。它是:'content:// com.android.providers.media.documents/document/video%3A27222' –

回答

0

一些测试后,所以和调整,我终于得到了VideoView工作。我发现使它有效的一些事情(至少对我来说)是:

1.它需要在FrameLayout之内。

我试过在layout_height设置为match_parentwrap_content的嵌套内RelativeLayout/LinearLayout,但它不起作用。与FrameLayoutlayout_height的价值似乎并不重要。

2. VideoViewlayout_height必须设置为match_parent

我检查的官方文档here,但在inherited XML节,有没有提到它继承layout_heightlayout_width,或者即使其值必须是match_parent,但我无法以其他方式使用它。尽管它确实声明它继承了minHeight,但设置wrap_contentminHeight仍然不会呈现该视图。

======

我不知道这是否会有所帮助,但我也做了Clean Project在此之前的作品,所以它可能是扮演一个角色这一点。之后,我做了各种测试来回复我的问题,并得出了我在上面写的几点。虽然我在SO中读到很多人使用RelativeLayout或LinearLayout来保存这个视图,并且它和它们一起工作,但我似乎无法在我的测试过程中使它工作。

希望这可以帮助其他面临这个问题的人。

0

我面临类似的问题。 uploadedVid.setZOrderOnTop(true);是罪魁祸首。我建议你使用编译“com.sprylab.android.texturevideoview:texturevideoview:1.1.1”库,而不是默认VideoView

+0

谢谢你的帮助!我无法测试您的解决方案atm,但最初,我没有'uploadedVid.setZOrderOnTop(true);'编码。我发现这是我在其他问题上提出的一个很好的答案,所以我添加了它,但可悲的是它对我没有帮助。一旦我能够,我一定会测试出你的建议:) –

+0

所以我能够尝试你的建议,它工作正常:)。该视频比使用VideoView时慢了一两秒,但只要它不会失去同步(视频到音频),除非有人将它并排比较,否则它不会很明显: )。谢谢,但我认为我会继续使用VideoView,现在我设法让它工作:) –

+0

其实VideoView扩展了SurfaceView。如果我们使用setZOrderOnTop(true)你不能添加任何视图,例如(Play,Pause和ProgressBar ..等等。这就是我建议使用第三方库的原因。由你决定@aya – Srikanth104