MediaResourceGetter.java revision 3551c9c881056c480085172ff9840cab31610854
1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// Use of this source code is governed by a BSD-style license that can be 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// found in the LICENSE file. 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgpackage org.chromium.content.browser; 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.content.Context; 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.content.pm.PackageManager; 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.media.MediaMetadataRetriever; 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.net.ConnectivityManager; 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.net.NetworkInfo; 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.net.Uri; 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.text.TextUtils; 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.util.Log; 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport org.chromium.base.CalledByNative; 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport org.chromium.base.JNINamespace; 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport org.chromium.base.PathUtils; 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport java.io.File; 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport java.util.HashMap; 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/** 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Java counterpart of android MediaResourceGetter. 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org@JNINamespace("content") 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgclass MediaResourceGetter { 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private static final String TAG = "MediaResourceGetter"; 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private static class MediaMetadata { 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private final int mDurationInMilliseconds; 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private final int mWidth; 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private final int mHeight; 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private final boolean mSuccess; 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private MediaMetadata(int durationInMilliseconds, int width, int height, boolean success) { 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org mDurationInMilliseconds = durationInMilliseconds; 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org mWidth = width; 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org mHeight = height; 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org mSuccess = success; 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org @CalledByNative("MediaMetadata") 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private int getDurationInMilliseconds() { return mDurationInMilliseconds; } 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org @CalledByNative("MediaMetadata") 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private int getWidth() { return mWidth; } 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org @CalledByNative("MediaMetadata") 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private int getHeight() { return mHeight; } 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org @CalledByNative("MediaMetadata") 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private boolean isSuccess() { return mSuccess; } 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org @CalledByNative 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org private static MediaMetadata extractMediaMetadata(Context context, String url, String cookies) { 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int durationInMilliseconds = 0; 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int width = 0; 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int height = 0; 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org boolean success = false; 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org // TODO(qinmin): use ConnectionTypeObserver to listen to the network type change. 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ConnectivityManager mConnectivityManager = 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (mConnectivityManager != null) { 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (context.checkCallingOrSelfPermission( 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org android.Manifest.permission.ACCESS_NETWORK_STATE) != 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PackageManager.PERMISSION_GRANTED) { 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return new MediaMetadata(0, 0, 0, false); 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NetworkInfo info = mConnectivityManager.getActiveNetworkInfo(); 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (info == null) { 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return new MediaMetadata(durationInMilliseconds, width, height, success); 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (info.getType()) { 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case ConnectivityManager.TYPE_ETHERNET: 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case ConnectivityManager.TYPE_WIFI: 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case ConnectivityManager.TYPE_WIMAX: 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case ConnectivityManager.TYPE_MOBILE: 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return new MediaMetadata(durationInMilliseconds, width, height, success); 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org try { 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org Uri uri = Uri.parse(url); 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org String scheme = uri.getScheme(); 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (scheme == null || scheme.equals("file")) { 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org File file = new File(uri.getPath()); 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org String path = file.getAbsolutePath(); 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (file.exists() && (path.startsWith("/mnt/sdcard/") || 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org path.startsWith("/sdcard/") || 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org path.startsWith(PathUtils.getExternalStorageDirectory()))) { 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org retriever.setDataSource(path); 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } else { 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org Log.e(TAG, "Unable to read file: " + url); 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return new MediaMetadata(durationInMilliseconds, width, height, success); 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } else { 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org HashMap<String, String> headersMap = new HashMap<String, String>(); 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!TextUtils.isEmpty(cookies)) { 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org headersMap.put("Cookie", cookies); 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org retriever.setDataSource(url, headersMap); 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org String duration = retriever.extractMetadata( 111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org MediaMetadataRetriever.METADATA_KEY_DURATION); 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org String videoWidth = retriever.extractMetadata( 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org String videoHeight = retriever.extractMetadata( 115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); 116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (duration == null || videoWidth == null || videoHeight == null) { 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return new MediaMetadata(durationInMilliseconds, width, height, success); 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org durationInMilliseconds = Integer.parseInt(duration); 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org width = Integer.parseInt(videoWidth); 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org height = Integer.parseInt(videoHeight); 122 success = true; 123 } catch (IllegalArgumentException e) { 124 Log.e(TAG, "Invalid url: " + e); 125 } catch (RuntimeException e) { 126 Log.e(TAG, "Invalid url: " + e); 127 } 128 return new MediaMetadata(durationInMilliseconds, width, height, success); 129 } 130} 131