5

Tôi có phiên bản VideoView. Tôi cần biết đường dẫn nguồn video từ nó.Android nhận đường dẫn nguồn video từ VideoView

Có thể không? Ai có thể giúp tôi?

Mã của tôi từ lớp WebChromeClient là:

@Override 
public void onShowCustomView(final View view, final CustomViewCallback callback) { 
    super.onShowCustomView(view, callback); 

    if (view instanceof FrameLayout) { 
     final FrameLayout frame = (FrameLayout) view; 
     if (frame.getFocusedChild() instanceof VideoView) { 
      // get video view 

      video = (VideoView) frame.getFocusedChild(); 
     } 
    } 
} 

Làm thế nào để có được con đường nguồn video fron Video đối tượng?

Trả lời

15

VideoView không có getters cho đường dẫn video/Uri. Thay đổi duy nhất của bạn là sử dụng sự phản chiếu. Các Uri được lưu trữ trong private Uri mUri. Để truy cập, bạn có thể sử dụng:

Uri mUri = null; 
try { 
    Field mUriField = VideoView.class.getDeclaredField("mUri"); 
    mUriField.setAccessible(true); 
    mUri = (Uri)mUriField.get(video); 
} catch(Exception e) {} 

Chỉ cần nhớ rằng trường riêng tư có thể bị thay đổi trong bản phát hành Android trong tương lai.

+5

Tomik, cảm ơn rất nhiều !!! Đó là giải pháp thực sự thú vị. đó là một điều đáng tiếc đó là VideoView không có công khai cho lĩnh vực này – ihrupin

+0

Bạn xứng đáng nhận được một số giải thưởng. Thực hiện tốt. –

9

Bạn có thể ghi đè lên setVideoUriMethod trong VideoView nếu bạn không thích sử dụng phương pháp riêng như thế này:

public class MyVideoView extends VideoView 
{ 
    Uri uri; 

    @Override 
    public void setVideoURI (Uri uri) 
    { 
     super.setVideoURI(uri); 
     this.uri = uri; 
    } 
} 

Bây giờ bạn có thể truy cập vào uri của videoview khi cần thiết. Hy vọng rằng sẽ giúp.

+0

Theo tôi, đây là câu trả lời tốt hơn. Câu trả lời của Tomik khi sử dụng công trình Reflection, nhưng nó có thể phá vỡ trong tương lai (những thay đổi đối với SDK Android trên các cấp API khác nhau). Tôi đã bị cắn bởi điều này trong quá khứ. – dell116

3

Một giải pháp thay thế khác là đặt Uri/đường dẫn video trên thẻ của chế độ xem và truy xuất sau.

Khi bạn chơi/bắt đầu

videoView.setVideoPath(localPath); 
videoView.setTag(localPath); 

Khi bạn muốn kiểm tra những gì đang chơi

String pathOfCurrentVideoPlaying = (String)videoView.getTag(); 

Chỉ cần nhớ để xóa khỏi thẻ nếu sử dụng trong một bộ chuyển đổi.