0

맞춤 h264 전송 스트림을 재생하는 동영상 플레이어 앱이 있습니다. 나는 사용자가 "갤러리"를 열고, "영화"를 선택하고, 시작할 앱을 선택하는 영화를 선택한 후 ...이 모든 것이 완벽하게 작동하는 등의 방법으로 플레이어를 시작할 수있는 권한이 주어졌습니다. 내 문제는 ContentResolver를 사용하여 InputStream을 앞뒤로 검색하는 방법에있다.Android 콘텐츠 URI의 FileInputStream 가져 오기 (또는 InputStream 검색 방법)

나는 건너 뛰고 마크/리셋이 우리의 플레이어에서 원하는 작동하지 않습니다,하지만 큰 비디오 파일과 많은 많은 등 Android: Getting a file URI from a content URI?뿐만 아니라 여기에 글뿐만 아니라 다른 방법을 통해의 InputStream 사용에 대한 호언 장담 http://commonsware.com/blog/2013/08/07/for-android-apis-think-streams-not-files.html을 읽었습니다 그래서 평범한 InputStream은 쓸모가 없다. FileInputStream은 훌륭하게 작동하며, 해킹으로 resolver.getInputStream을 FileInputStream에 던져서 공을 썼지 만 해킹이된다. 내용 uri의 File 객체 또는 FileInputStream? 또는 어떻게 효과적으로 입력 스트림을 찾을 수 있습니까?

+0

이것이 왜 downvoted인지 확실하지 않습니까? 안드로이드 4.4에서 uri 메소드의 경로가 더 이상 안정적으로 작동하지 않으며 android 5.0을 사용하면 콘텐츠 유형을 얻을 가능성이 높아지고 관련성 높은 좋은 질문이됩니다 ... downvote로 가면 알려주세요. 왜? – PapaWhiskey

답변

1

콘텐츠 URI가 파일에 의해 백업되지 않을 수도 있지만 가능한지 확인할 수 있습니다 ... ParcelFileDescriptor에서 getStatSize을 사용할 수 있으며 배킹 애셋이 파일, 그렇지 않으면 -1. 그것이 파일이라면 분명히 FileInputStream과 기본 채널을 얻을 수 있습니다

1

내 문제는 항상 가능하지 않을 것

컨텐트 리졸버

를 사용하여의 InputStream에 앞뒤로 추구하는 방법이다. ContentProviderInputStream 내용을 제공하는 방법에 따라 다릅니다. 파일로 백업 된 ParcelFileDescriptor을 사용하는 경우 스트림을 검색 할 수 있습니다. createPipe()으로 생성 된 파이프에 의해 뒷받침되는 ParcelFileDescriptor을 사용하는 경우 스트림을 검색 할 수 없습니다. ParcelFileDescriptor에 최신 파이프 옵션 중 일부를 테스트하지는 않았지만이 파이프 옵션도 검색 할 수 없기를 기대합니다.

하지만 큰 비디오 파일과

, 건너 뛰고 마크/리셋 내가 그 방법은 일부 작업을 기대하는 우리 선수

에서 추구를 위해 작동하지만하지 않습니다 모든, content://Uri 값. skip(), mark()reset() 이외의 것이 필요하다고 말하는 경우 귀하의 의도가 확실하지 않습니다.

FileInputStream 객체 잘 작동하고 해킹으로 나는 FileInputStream에에 resolver.getInputStream 캐스팅하고 볼

확실히

그것은하지 않습니다 안정적으로 "플레이 볼"을했다. 또한 from InputStream이 상속되지 않은 on FileInputStream 인 시나리오와 관련없는 메서드가 표시되지 않으므로이 메서드는 쓸모없는 것처럼 보입니다. 특히, mark(), reset()skip()InputStream에있다.

콘텐츠 uri에서 File 개체 또는 FileInputStream을 가져 오는 방법은 무엇입니까?

그렇지 않습니다. 예를 들어 동영상 파일은 이동식 저장소에있을 수 있으며 Android 4.4 이상에서는 이동식 저장소에있는 파일에 직접 액세스 할 수 없습니다.

효과적으로 입력 스트림을 검색 할 수 있습니까?

markSupported() 반환 true의 경우, mark()reset()를 사용합니다. 그렇지 않다면 사용자에게 스트림을 재생할 수 없거나 탐색이 필요한 옵션을 사용 중지하거나 나만의 캐싱을 수행한다고 알립니다., 되감기 조작의 경우) 스트림에서 읽은 데이터를 가져옵니다.

+0

1. BufferedInputStream을 사용하는 경우 문서에 마크/리셋 기능이 지원된다고합니다 ... 그러나 파일 크기가 클 경우 (비디오 파일 인 경우가 많음), ' 스트리밍 (또는 건너 뛴) 앞으로 많이 (또는 적어도 나를 위해 일한 hasnt). 2. FileInputStream을 사용하면 기본 채널을 가져 와서 위치를 설정할 수 있으므로 사용자가 비디오를 스크럽 할 때 파일의 아무 곳이나 가면서 완벽하게 움직일 수 있습니다. 3. 내부 미디어 플레이어는 4.4에서 어떻게 추구합니까? 그것은 분명히 할 수있어, 난 그냥 방법 (따라서 q를) 을 찾을 수 없습니다 4. 해킹은 테스트 및 해킹 – PapaWhiskey

+0

@ PapaWhiskey : "당신은"돌아올 수 없다 "후에 당신이 스트리밍 (또는 건너 뛴) 앞으로 많이 (또는 적어도 나를 위해 일한 hasnt) "- 그것은 기본 데이터 소스에 의존해야합니다. "내부 미디어 플레이어는 4.4에서 어떻게 추구합니까?" - "내부"로 "사전 설치"를 의미하는 경우 사전 설치된 응용 프로그램은 제조업체가 이러한 방식으로 설정 한 경우 이동식 저장소에서도 파일에 액세스 할 수 있습니다. 또한 미리 설치된 앱은'MediaStore'의 내부 동작을 알 수 있으며 임의의 기기에 배포 된 SDK 앱보다 많은 가정을 할 수 있습니다. – CommonsWare

+0

@PapaWhiskey : 원하는 것을 얻으려면 파일 접근이 필요할 것입니다. 파일에 안정적으로 접근 할 수있는 방법이 없습니다. 특히 안드로이드 4.4 이상에서 이동식 미디어를 사용하는 경우가 있습니다. – CommonsWare