正在显示
5 个修改的文件
包含
135 行增加
和
68 行删除
| @@ -21,17 +21,30 @@ android { | @@ -21,17 +21,30 @@ android { | ||
| 21 | targetCompatibility 1.8 | 21 | targetCompatibility 1.8 |
| 22 | sourceCompatibility 1.8 | 22 | sourceCompatibility 1.8 |
| 23 | } | 23 | } |
| 24 | + flavorDimensions "abi" | ||
| 25 | + | ||
| 26 | + productFlavors { | ||
| 27 | + arm { dimension "abi" } | ||
| 28 | + // aarch64 { dimension "abi" } | ||
| 29 | + } | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +ext { | ||
| 33 | + geckoviewChannel = "nightly" | ||
| 34 | + // geckoviewVersion = "64.0.20180927100037" | ||
| 35 | + // geckoviewVersion = "66.0.20181231091417" | ||
| 36 | + geckoviewVersion = "66.0.20190116093310" | ||
| 24 | } | 37 | } |
| 25 | 38 | ||
| 26 | dependencies { | 39 | dependencies { |
| 27 | implementation fileTree(dir: 'libs', include: ['*.jar']) | 40 | implementation fileTree(dir: 'libs', include: ['*.jar']) |
| 28 | - implementation 'com.android.support:appcompat-v7:26.1.0' | ||
| 29 | - implementation 'com.android.support:design:26.1.0' | ||
| 30 | - implementation 'com.android.support.constraint:constraint-layout:1.0.2' | ||
| 31 | - implementation 'com.android.support:support-vector-drawable:26.1.0' | ||
| 32 | - implementation 'org.webrtc:google-webrtc:1.0.+' | 41 | + implementation 'com.android.support:appcompat-v7:27.1.1' |
| 42 | + implementation 'com.android.support:design:27.1.0' | ||
| 43 | + implementation 'com.android.support.constraint:constraint-layout:1.1.3' | ||
| 44 | + implementation 'com.android.support:support-vector-drawable:27.1.0' | ||
| 33 | // testImplementation 'junit:junit:4.12' | 45 | // testImplementation 'junit:junit:4.12' |
| 34 | // androidTestImplementation 'com.android.support.test:runner:1.0.1' | 46 | // androidTestImplementation 'com.android.support.test:runner:1.0.1' |
| 35 | // androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' | 47 | // androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' |
| 48 | + armImplementation "org.mozilla.geckoview:geckoview-${geckoviewChannel}-armeabi-v7a:${geckoviewVersion}" | ||
| 36 | } | 49 | } |
| 37 | 50 |
| @@ -18,6 +18,10 @@ | @@ -18,6 +18,10 @@ | ||
| 18 | </intent-filter> | 18 | </intent-filter> |
| 19 | </activity> | 19 | </activity> |
| 20 | </application> | 20 | </application> |
| 21 | + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> | ||
| 22 | + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> | ||
| 23 | + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> | ||
| 24 | + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> | ||
| 21 | <uses-permission android:name ="android.permission.RECORD_AUDIO"/> | 25 | <uses-permission android:name ="android.permission.RECORD_AUDIO"/> |
| 22 | <uses-permission android:name ="android.permission.MODIFY_AUDIO_SETTINGS"/> | 26 | <uses-permission android:name ="android.permission.MODIFY_AUDIO_SETTINGS"/> |
| 23 | <uses-permission android:name="android.permission.CAMERA" /> | 27 | <uses-permission android:name="android.permission.CAMERA" /> |
| @@ -7,6 +7,7 @@ import android.content.pm.PackageManager; | @@ -7,6 +7,7 @@ import android.content.pm.PackageManager; | ||
| 7 | import android.net.Uri; | 7 | import android.net.Uri; |
| 8 | import android.os.Build; | 8 | import android.os.Build; |
| 9 | import android.os.Bundle; | 9 | import android.os.Bundle; |
| 10 | +import android.os.SystemClock; | ||
| 10 | import android.support.annotation.NonNull; | 11 | import android.support.annotation.NonNull; |
| 11 | import android.support.design.widget.BottomNavigationView; | 12 | import android.support.design.widget.BottomNavigationView; |
| 12 | import android.support.v4.app.ActivityCompat; | 13 | import android.support.v4.app.ActivityCompat; |
| @@ -15,22 +16,24 @@ import android.support.v7.app.AppCompatActivity; | @@ -15,22 +16,24 @@ import android.support.v7.app.AppCompatActivity; | ||
| 15 | import android.util.Log; | 16 | import android.util.Log; |
| 16 | import android.view.MenuItem; | 17 | import android.view.MenuItem; |
| 17 | import android.view.View; | 18 | import android.view.View; |
| 18 | -import android.webkit.ConsoleMessage; | ||
| 19 | -import android.webkit.PermissionRequest; | ||
| 20 | -import android.webkit.WebChromeClient; | ||
| 21 | -import android.webkit.WebSettings; | ||
| 22 | -import android.webkit.WebView; | ||
| 23 | -import android.webkit.WebViewClient; | 19 | +import org.mozilla.geckoview.GeckoRuntime; |
| 20 | +import org.mozilla.geckoview.GeckoSession; | ||
| 21 | +import org.mozilla.geckoview.GeckoView; | ||
| 24 | 22 | ||
| 25 | import com.xuedianyun.cloudclass.R; | 23 | import com.xuedianyun.cloudclass.R; |
| 26 | 24 | ||
| 25 | +import java.util.Locale; | ||
| 26 | + | ||
| 27 | public class MainActivity extends AppCompatActivity { | 27 | public class MainActivity extends AppCompatActivity { |
| 28 | private static final int CAMERA_REQUEST = 1888; | 28 | private static final int CAMERA_REQUEST = 1888; |
| 29 | 29 | ||
| 30 | - private WebView mWebView; | 30 | + private GeckoView mWebView; |
| 31 | + private GeckoSession mSession; | ||
| 31 | //private String mCustomURL = "https://pclive.xuedianyun.com/pcBase/agora/"; | 32 | //private String mCustomURL = "https://pclive.xuedianyun.com/pcBase/agora/"; |
| 32 | private String mCustomURL = "https://webrtc.github.io/samples/src/content/devices/input-output/"; | 33 | private String mCustomURL = "https://webrtc.github.io/samples/src/content/devices/input-output/"; |
| 33 | private String mWebrtcURL = "https://janus.conf.meetecho.com/videoroomtest.html"; | 34 | private String mWebrtcURL = "https://janus.conf.meetecho.com/videoroomtest.html"; |
| 35 | + private String mUrl; | ||
| 36 | + private static final int REQUEST_PERMISSIONS = 2; | ||
| 34 | 37 | ||
| 35 | private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener | 38 | private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener |
| 36 | = new BottomNavigationView.OnNavigationItemSelectedListener() { | 39 | = new BottomNavigationView.OnNavigationItemSelectedListener() { |
| @@ -39,16 +42,18 @@ public class MainActivity extends AppCompatActivity { | @@ -39,16 +42,18 @@ public class MainActivity extends AppCompatActivity { | ||
| 39 | public boolean onNavigationItemSelected(@NonNull MenuItem item) { | 42 | public boolean onNavigationItemSelected(@NonNull MenuItem item) { |
| 40 | switch (item.getItemId()) { | 43 | switch (item.getItemId()) { |
| 41 | case R.id.navigation_custom: | 44 | case R.id.navigation_custom: |
| 42 | - mWebView.loadUrl(mCustomURL); | 45 | + mUrl = mCustomURL; |
| 46 | + mSession.loadUri(mUrl); | ||
| 43 | return true; | 47 | return true; |
| 44 | case R.id.navigation_webrtc: | 48 | case R.id.navigation_webrtc: |
| 45 | - mWebView.loadUrl(mWebrtcURL); | 49 | + mUrl = mWebrtcURL; |
| 50 | + mSession.loadUri(mUrl); | ||
| 46 | return true; | 51 | return true; |
| 47 | case R.id.navigation_refresh: | 52 | case R.id.navigation_refresh: |
| 48 | - mWebView.reload(); | 53 | + mSession.reload(); |
| 49 | return true; | 54 | return true; |
| 50 | case R.id.navigation_open: | 55 | case R.id.navigation_open: |
| 51 | - openBrowserWithURL(mWebView.getUrl()); | 56 | + openBrowserWithURL(mUrl); |
| 52 | return true; | 57 | return true; |
| 53 | } | 58 | } |
| 54 | return false; | 59 | return false; |
| @@ -84,6 +89,12 @@ public class MainActivity extends AppCompatActivity { | @@ -84,6 +89,12 @@ public class MainActivity extends AppCompatActivity { | ||
| 84 | 89 | ||
| 85 | return; | 90 | return; |
| 86 | } | 91 | } |
| 92 | + case REQUEST_PERMISSIONS: { | ||
| 93 | + final ExamplePermissionDelegate permission = (ExamplePermissionDelegate) | ||
| 94 | + mSession.getPermissionDelegate(); | ||
| 95 | + permission.onRequestPermissionsResult(permissions, grantResults); | ||
| 96 | + return; | ||
| 97 | + } | ||
| 87 | 98 | ||
| 88 | // other 'case' lines to check for other | 99 | // other 'case' lines to check for other |
| 89 | // permissions this app might request | 100 | // permissions this app might request |
| @@ -92,40 +103,17 @@ public class MainActivity extends AppCompatActivity { | @@ -92,40 +103,17 @@ public class MainActivity extends AppCompatActivity { | ||
| 92 | 103 | ||
| 93 | private void createWebView() { | 104 | private void createWebView() { |
| 94 | 105 | ||
| 95 | - mWebView = (WebView) findViewById(R.id.webview); | ||
| 96 | - setUpWebViewDefaults(mWebView); | ||
| 97 | - mWebView.loadUrl(mCustomURL); | ||
| 98 | - mWebView.setWebChromeClient(new WebChromeClient() { | ||
| 99 | - | ||
| 100 | - public boolean onConsoleMessage(ConsoleMessage m) { | ||
| 101 | - Log.d("getUserMedia, WebView", m.message() + " -- From line " | ||
| 102 | - + m.lineNumber() + " of " | ||
| 103 | - + m.sourceId()); | ||
| 104 | - | ||
| 105 | - return true; | ||
| 106 | - } | ||
| 107 | - | ||
| 108 | - @Override | ||
| 109 | - public void onPermissionRequest(final PermissionRequest request) { | ||
| 110 | - | ||
| 111 | - // getActivity(). | ||
| 112 | - MainActivity.this.runOnUiThread(new Runnable() { | ||
| 113 | - @TargetApi(Build.VERSION_CODES.LOLLIPOP) | ||
| 114 | - @Override | ||
| 115 | - public void run() { | ||
| 116 | - // Below isn't necessary, however you might want to: | ||
| 117 | - // 1) Check what the site is and perhaps have a blacklist | ||
| 118 | - // 2) Have a pop up for the user to explicitly give permission | ||
| 119 | - //if(request.getOrigin().toString().equals("https://pclive.xuedianyun.com/") || | ||
| 120 | - // request.getOrigin().toString().equals("https://janus.conf.meetecho.com/")) { | ||
| 121 | - request.grant(request.getResources()); | ||
| 122 | - // } else { | ||
| 123 | - // request.deny(); | ||
| 124 | - // } | ||
| 125 | - } | ||
| 126 | - }); | ||
| 127 | - } | ||
| 128 | - }); | 106 | + mWebView = (GeckoView) findViewById(R.id.webview); |
| 107 | + mSession = new GeckoSession(); | ||
| 108 | + GeckoRuntime runtime = GeckoRuntime.create(this); | ||
| 109 | + | ||
| 110 | + mSession.open(runtime); | ||
| 111 | + mWebView.setSession(mSession); | ||
| 112 | + mUrl = mCustomURL; | ||
| 113 | + final ExamplePermissionDelegate permission = new ExamplePermissionDelegate(); | ||
| 114 | + permission.androidPermissionRequestCode = REQUEST_PERMISSIONS; | ||
| 115 | + mSession.setPermissionDelegate(permission); | ||
| 116 | + mSession.loadUri(mUrl); | ||
| 129 | } | 117 | } |
| 130 | 118 | ||
| 131 | private void checkForAndAskForPermissions() { | 119 | private void checkForAndAskForPermissions() { |
| @@ -160,30 +148,89 @@ public class MainActivity extends AppCompatActivity { | @@ -160,30 +148,89 @@ public class MainActivity extends AppCompatActivity { | ||
| 160 | } | 148 | } |
| 161 | } | 149 | } |
| 162 | 150 | ||
| 163 | - private void setUpWebViewDefaults(WebView webView) { | ||
| 164 | 151 | ||
| 165 | - WebSettings settings = webView.getSettings(); | ||
| 166 | - settings.setJavaScriptEnabled(true); | 152 | + private class ExamplePermissionDelegate implements GeckoSession.PermissionDelegate { |
| 153 | + | ||
| 154 | + public int androidPermissionRequestCode = 1; | ||
| 155 | + private Callback mCallback; | ||
| 156 | + | ||
| 157 | + public void onRequestPermissionsResult(final String[] permissions, | ||
| 158 | + final int[] grantResults) { | ||
| 159 | + if (mCallback == null) { | ||
| 160 | + return; | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + final Callback cb = mCallback; | ||
| 164 | + mCallback = null; | ||
| 165 | + for (final int result : grantResults) { | ||
| 166 | + if (result != PackageManager.PERMISSION_GRANTED) { | ||
| 167 | + // At least one permission was not granted. | ||
| 168 | + cb.reject(); | ||
| 169 | + return; | ||
| 170 | + } | ||
| 171 | + } | ||
| 172 | + cb.grant(); | ||
| 173 | + } | ||
| 167 | 174 | ||
| 168 | - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { | ||
| 169 | - webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); | 175 | + @Override |
| 176 | + public void onAndroidPermissionsRequest(final GeckoSession session, final String[] permissions, | ||
| 177 | + final Callback callback) { | ||
| 178 | + if (Build.VERSION.SDK_INT >= 23) { | ||
| 179 | + // requestPermissions was introduced in API 23. | ||
| 180 | + mCallback = callback; | ||
| 181 | + requestPermissions(permissions, androidPermissionRequestCode); | ||
| 182 | + } else { | ||
| 183 | + callback.grant(); | ||
| 184 | + } | ||
| 170 | } | 185 | } |
| 171 | 186 | ||
| 172 | - settings.setCacheMode(WebSettings.LOAD_NO_CACHE); | ||
| 173 | - settings.setAllowContentAccess(true); | ||
| 174 | - settings.setAllowFileAccessFromFileURLs(true); | ||
| 175 | - settings.setAllowUniversalAccessFromFileURLs(true); | ||
| 176 | - settings.setJavaScriptCanOpenWindowsAutomatically(true); | ||
| 177 | - settings.setMediaPlaybackRequiresUserGesture(false); | 187 | + @Override |
| 188 | + public void onContentPermissionRequest(final GeckoSession session, final String uri, | ||
| 189 | + final int type, final Callback callback) { | ||
| 190 | + final int resId; | ||
| 191 | + /* if (PERMISSION_GEOLOCATION == type) { | ||
| 192 | + resId = R.string.request_geolocation; | ||
| 193 | + } else if (PERMISSION_DESKTOP_NOTIFICATION == type) { | ||
| 194 | + resId = R.string.request_notification; | ||
| 195 | + } else if (PERMISSION_AUTOPLAY_MEDIA == type) { | ||
| 196 | + resId = R.string.request_autoplay; | ||
| 197 | + } else { | ||
| 198 | + Log.w(LOGTAG, "Unknown permission: " + type); | ||
| 199 | + callback.reject(); | ||
| 200 | + return; | ||
| 201 | + } | ||
| 178 | 202 | ||
| 179 | - // Enable remote debugging via chrome://inspect | ||
| 180 | - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { | ||
| 181 | - WebView.setWebContentsDebuggingEnabled(true); | 203 | + final String title = getString(resId, Uri.parse(uri).getAuthority()); |
| 204 | + final BasicGeckoViewPrompt prompt = (BasicGeckoViewPrompt) | ||
| 205 | + mGeckoSession.getPromptDelegate(); | ||
| 206 | + prompt.onPermissionPrompt(session, title, callback);*/ | ||
| 207 | + callback.grant(); | ||
| 182 | } | 208 | } |
| 183 | 209 | ||
| 184 | - webView.clearCache(true); | ||
| 185 | - webView.clearHistory(); | ||
| 186 | - webView.setWebViewClient(new WebViewClient()); | 210 | + @Override |
| 211 | + public void onMediaPermissionRequest(final GeckoSession session, final String uri, | ||
| 212 | + final MediaSource[] video, final MediaSource[] audio, | ||
| 213 | + final MediaCallback callback) { | ||
| 214 | + /* final String host = Uri.parse(uri).getAuthority(); | ||
| 215 | + final String title; | ||
| 216 | + if (audio == null) { | ||
| 217 | + title = getString(R.string.request_video, host); | ||
| 218 | + } else if (video == null) { | ||
| 219 | + title = getString(R.string.request_audio, host); | ||
| 220 | + } else { | ||
| 221 | + title = getString(R.string.request_media, host); | ||
| 222 | + } | ||
| 223 | + | ||
| 224 | + String[] videoNames = normalizeMediaName(video); | ||
| 225 | + String[] audioNames = normalizeMediaName(audio); | ||
| 226 | + | ||
| 227 | + final BasicGeckoViewPrompt prompt = (BasicGeckoViewPrompt) | ||
| 228 | + mGeckoSession.getPromptDelegate(); | ||
| 229 | + prompt.onMediaPrompt(session, title, video, audio, videoNames, audioNames, callback);*/ | ||
| 230 | + MediaSource v = video.length > 0 ? video[0] : null; | ||
| 231 | + MediaSource a = video.length > 0 ? audio[0]:null; | ||
| 232 | + callback.grant(v,a); | ||
| 233 | + } | ||
| 187 | } | 234 | } |
| 188 | 235 | ||
| 189 | private void openBrowserWithURL(String url) { | 236 | private void openBrowserWithURL(String url) { |
| @@ -19,7 +19,7 @@ | @@ -19,7 +19,7 @@ | ||
| 19 | app:layout_constraintRight_toRightOf="parent" | 19 | app:layout_constraintRight_toRightOf="parent" |
| 20 | app:menu="@menu/navigation" /> | 20 | app:menu="@menu/navigation" /> |
| 21 | 21 | ||
| 22 | - <WebView | 22 | + <org.mozilla.geckoview.GeckoView |
| 23 | android:id="@+id/webview" | 23 | android:id="@+id/webview" |
| 24 | android:layout_width="fill_parent" | 24 | android:layout_width="fill_parent" |
| 25 | android:layout_height="fill_parent" /> | 25 | android:layout_height="fill_parent" /> |
-
请 注册 或 登录 后发表评论