2016-12-06 2 views
0

Мне нужна помощь с проблемой VideoView в Android. Я пробовал все и даже смотрю на вопросы stackoverflow, но никто не имеет этой точной проблемы.videoView ничего не показывает

Проблема: Взгляд должен показывать отборные видео из галереи (это действие вызывается с помощью кнопки), но несмотря на то, что нет никакой ошибки в журнале и Ури не нуль ничего показано в представлении , Все это находится в Fragment внутри ViewPager. (Если смотреть на код ниже, то Log.d("FragCamera", "I_REQUEST_VIDEO_PICK mediaUri : " + mediaUri); запускается и mediaUri не null. Так что я не знаю, что еще может быть проблема.)

Btw, я использую Зефир реальное устройство, чтобы проверить это с помощью 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 ok, я могу дать правильное (реальное) значение mediaUri из журнала. Это: 'content: // com.android.providers.media.documents/document/video% 3A27222' –

ответ

0

Таким образом, после нескольких испытаний и настройки, я, наконец, получил VideoView работать. Несколько вещей, которые я нашел, чтобы они работали (по крайней мере, для моего случая):

1. Он должен быть внутри FrameLayout.

Я попытался вложенности его внутри RelativeLayout/LinearLayout с layout_height набором к match_parent или wrap_content, но он не работает. С FrameLayout либо значение для layout_height, похоже, не имеет значения.

2. VideoViewlayout_height должен быть установлен в match_parent

Я проверил официальный документ here, но в разделе inherited XML, нет никакого упоминания он унаследовал layout_height или layout_width, или даже если это значение должно быть match_parent, но я не могу заставить его работать каким-либо другим способом. И хотя он заявляет, что унаследовал minHeight, установка wrap_content с minHeight по-прежнему не отображает представление.

======

Я не знаю, если это помогает, но я также сделать Clean Project прежде, чем это работает, так что он может играть роль в этом. Еще позже, я сделал различные тесты, чтобы вызвать мою проблему, и это приводит к тому, что я написал выше.

И хотя я читал в SO, что многие люди используют RelativeLayout или даже LinearLayout, чтобы держать это представление, и он работает с ними, я просто не могу заставить его работать в моей работе во время моего теста.

Надеюсь, это поможет другим людям, столкнувшимся с этой проблемой.

0

я столкнулся с аналогичной проблемой. uploadedVid.setZOrderOnTop (true); является виновником. Я хотел бы предложить вам использовать компиляции «com.sprylab.android.texturevideoview: texturevideoview: 1.1.1» библиотеку вместо стандартной VideoView

+0

Спасибо за помощь! Я не могу проверить ваше решение atm, но изначально я код без 'uploadedVid.setZOrderOnTop (true);'. Это то, что я нашел предложенным как ответ на другие вопросы здесь, в SO, поэтому я добавил его, но, к сожалению, это мне не помогает. Я обязательно проверю ваше предложение, как только смогу :) –

+0

, поэтому я могу попробовать ваше предложение, и оно работает нормально :). Видео просто на секунду или на два медленнее, чем когда я использую VideoView, но пока он не выходит из синхронизации (видео в аудио), это не будет очевидно, если кто-то не сравнит его рядом:). Спасибо, но я думаю, что я останусь с VideoView сейчас, когда мне удалось заставить его работать :) –

+0

На самом деле VideoView расширяет SurfaceView. Так что, если вы используете setZOrderOnTop (true), вы не можете добавить какие-либо представления, как (Play, Pause и ProgressBar ..etc) Именно поэтому я предложил использовать стороннюю библиотеку. Это зависит от вас @aya – Srikanth104

Смежные вопросы