胡斌

use firefox geckoview

... ... @@ -21,17 +21,30 @@ android {
targetCompatibility 1.8
sourceCompatibility 1.8
}
flavorDimensions "abi"
productFlavors {
arm { dimension "abi" }
// aarch64 { dimension "abi" }
}
}
ext {
geckoviewChannel = "nightly"
// geckoviewVersion = "64.0.20180927100037"
// geckoviewVersion = "66.0.20181231091417"
geckoviewVersion = "66.0.20190116093310"
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.android.support:support-vector-drawable:26.1.0'
implementation 'org.webrtc:google-webrtc:1.0.+'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-vector-drawable:27.1.0'
// testImplementation 'junit:junit:4.12'
// androidTestImplementation 'com.android.support.test:runner:1.0.1'
// androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
armImplementation "org.mozilla.geckoview:geckoview-${geckoviewChannel}-armeabi-v7a:${geckoviewVersion}"
}
... ...
... ... @@ -18,6 +18,10 @@
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name ="android.permission.RECORD_AUDIO"/>
<uses-permission android:name ="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.CAMERA" />
... ...
... ... @@ -7,6 +7,7 @@ import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.ActivityCompat;
... ... @@ -15,22 +16,24 @@ import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.PermissionRequest;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import org.mozilla.geckoview.GeckoRuntime;
import org.mozilla.geckoview.GeckoSession;
import org.mozilla.geckoview.GeckoView;
import com.xuedianyun.cloudclass.R;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private static final int CAMERA_REQUEST = 1888;
private WebView mWebView;
private GeckoView mWebView;
private GeckoSession mSession;
//private String mCustomURL = "https://pclive.xuedianyun.com/pcBase/agora/";
private String mCustomURL = "https://webrtc.github.io/samples/src/content/devices/input-output/";
private String mWebrtcURL = "https://janus.conf.meetecho.com/videoroomtest.html";
private String mUrl;
private static final int REQUEST_PERMISSIONS = 2;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
... ... @@ -39,16 +42,18 @@ public class MainActivity extends AppCompatActivity {
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_custom:
mWebView.loadUrl(mCustomURL);
mUrl = mCustomURL;
mSession.loadUri(mUrl);
return true;
case R.id.navigation_webrtc:
mWebView.loadUrl(mWebrtcURL);
mUrl = mWebrtcURL;
mSession.loadUri(mUrl);
return true;
case R.id.navigation_refresh:
mWebView.reload();
mSession.reload();
return true;
case R.id.navigation_open:
openBrowserWithURL(mWebView.getUrl());
openBrowserWithURL(mUrl);
return true;
}
return false;
... ... @@ -84,6 +89,12 @@ public class MainActivity extends AppCompatActivity {
return;
}
case REQUEST_PERMISSIONS: {
final ExamplePermissionDelegate permission = (ExamplePermissionDelegate)
mSession.getPermissionDelegate();
permission.onRequestPermissionsResult(permissions, grantResults);
return;
}
// other 'case' lines to check for other
// permissions this app might request
... ... @@ -92,40 +103,17 @@ public class MainActivity extends AppCompatActivity {
private void createWebView() {
mWebView = (WebView) findViewById(R.id.webview);
setUpWebViewDefaults(mWebView);
mWebView.loadUrl(mCustomURL);
mWebView.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage m) {
Log.d("getUserMedia, WebView", m.message() + " -- From line "
+ m.lineNumber() + " of "
+ m.sourceId());
return true;
}
@Override
public void onPermissionRequest(final PermissionRequest request) {
// getActivity().
MainActivity.this.runOnUiThread(new Runnable() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void run() {
// Below isn't necessary, however you might want to:
// 1) Check what the site is and perhaps have a blacklist
// 2) Have a pop up for the user to explicitly give permission
//if(request.getOrigin().toString().equals("https://pclive.xuedianyun.com/") ||
// request.getOrigin().toString().equals("https://janus.conf.meetecho.com/")) {
request.grant(request.getResources());
// } else {
// request.deny();
// }
}
});
}
});
mWebView = (GeckoView) findViewById(R.id.webview);
mSession = new GeckoSession();
GeckoRuntime runtime = GeckoRuntime.create(this);
mSession.open(runtime);
mWebView.setSession(mSession);
mUrl = mCustomURL;
final ExamplePermissionDelegate permission = new ExamplePermissionDelegate();
permission.androidPermissionRequestCode = REQUEST_PERMISSIONS;
mSession.setPermissionDelegate(permission);
mSession.loadUri(mUrl);
}
private void checkForAndAskForPermissions() {
... ... @@ -160,30 +148,89 @@ public class MainActivity extends AppCompatActivity {
}
}
private void setUpWebViewDefaults(WebView webView) {
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
private class ExamplePermissionDelegate implements GeckoSession.PermissionDelegate {
public int androidPermissionRequestCode = 1;
private Callback mCallback;
public void onRequestPermissionsResult(final String[] permissions,
final int[] grantResults) {
if (mCallback == null) {
return;
}
final Callback cb = mCallback;
mCallback = null;
for (final int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
// At least one permission was not granted.
cb.reject();
return;
}
}
cb.grant();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
@Override
public void onAndroidPermissionsRequest(final GeckoSession session, final String[] permissions,
final Callback callback) {
if (Build.VERSION.SDK_INT >= 23) {
// requestPermissions was introduced in API 23.
mCallback = callback;
requestPermissions(permissions, androidPermissionRequestCode);
} else {
callback.grant();
}
}
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setAllowContentAccess(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setMediaPlaybackRequiresUserGesture(false);
@Override
public void onContentPermissionRequest(final GeckoSession session, final String uri,
final int type, final Callback callback) {
final int resId;
/* if (PERMISSION_GEOLOCATION == type) {
resId = R.string.request_geolocation;
} else if (PERMISSION_DESKTOP_NOTIFICATION == type) {
resId = R.string.request_notification;
} else if (PERMISSION_AUTOPLAY_MEDIA == type) {
resId = R.string.request_autoplay;
} else {
Log.w(LOGTAG, "Unknown permission: " + type);
callback.reject();
return;
}
// Enable remote debugging via chrome://inspect
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
final String title = getString(resId, Uri.parse(uri).getAuthority());
final BasicGeckoViewPrompt prompt = (BasicGeckoViewPrompt)
mGeckoSession.getPromptDelegate();
prompt.onPermissionPrompt(session, title, callback);*/
callback.grant();
}
webView.clearCache(true);
webView.clearHistory();
webView.setWebViewClient(new WebViewClient());
@Override
public void onMediaPermissionRequest(final GeckoSession session, final String uri,
final MediaSource[] video, final MediaSource[] audio,
final MediaCallback callback) {
/* final String host = Uri.parse(uri).getAuthority();
final String title;
if (audio == null) {
title = getString(R.string.request_video, host);
} else if (video == null) {
title = getString(R.string.request_audio, host);
} else {
title = getString(R.string.request_media, host);
}
String[] videoNames = normalizeMediaName(video);
String[] audioNames = normalizeMediaName(audio);
final BasicGeckoViewPrompt prompt = (BasicGeckoViewPrompt)
mGeckoSession.getPromptDelegate();
prompt.onMediaPrompt(session, title, video, audio, videoNames, audioNames, callback);*/
MediaSource v = video.length > 0 ? video[0] : null;
MediaSource a = video.length > 0 ? audio[0]:null;
callback.grant(v,a);
}
}
private void openBrowserWithURL(String url) {
... ...
... ... @@ -19,7 +19,7 @@
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/navigation" />
<WebView
<org.mozilla.geckoview.GeckoView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
... ...
... ... @@ -19,6 +19,9 @@ allprojects {
repositories {
google()
jcenter()
maven {
url "https://maven.mozilla.org/maven2/"
}
}
}
... ...