当您在 Chrome 中访问网站并播放 <audio>
时元素,chrome 将带有播放/暂停按钮的通知添加到通知区域。是否可以使用 webview 应用程序执行相同的操作?
我已成功在 Android Studio 中启动并运行,但无法弄清楚通知的内容
有什么指点吗?
编辑:这是我的意思的一个示例:https://developers.google.com/web/updates/2015/07/media-notifications这可能吗?
最佳答案
这是我制作的一个示例,这是为 StackOverflow 分配的,但没有相关文档。 https://gist.github.com/DrBrad/7574712c6140ccc468212afa04d9e458
将其放入 WebChromeClient.java
@Override
public void onProgressChanged(final WebView view, int newProgress){
super.onProgressChanged(view, newProgress);
if(newProgress == 100){
String code = "var videoElement;" +
"for(var i = 0; i < document.getElementsByTagName('video').length; i++){" +
" var vid = document.getElementsByTagName('video')[0];" +
" vid.onplay = function(){" +
" videoElement = vid;" +
" JSOUT.videoAction('true');" +
" };" +
" vid.onpause = function(){" +
" videoElement = vid;" +
" JSOUT.videoAction('false');" +
" };" +
"}";
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
wv.evaluateJavascript(code, null);
}else{
wv.loadUrl("javascript:"+code);
}
}
}
将其放入 JSInterface.java
public class JSInterface {
public static boolean playing;
@JavascriptInterface
public void videoAction(String type){
Log.e("Info", type);
playing = Boolean.parseBoolean(type);
if(playing){
NotificationManager mNotificationManager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(activity);
Notification notification = builder.getNotification();
notification.icon = R.drawable.icon;
RemoteViews contentView = new RemoteViews(activity.getPackageName(), R.layout.custom_notification);
notification.contentView = contentView;
notification.flags |= Notification.FLAG_ONGOING_EVENT;
contentView.setTextViewText(R.id.title, "Browser");
contentView.setTextViewText(R.id.desc, "This is a description. - PLAYING");
contentView.setImageViewResource(R.id.pausePlay, R.drawable.pause);
PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(activity, 0, new Intent(activity, NotificationPausePlay.class), 0);
contentView.setOnClickPendingIntent(R.id.pausePlay, pendingSwitchIntent);
mNotificationManager.notify(99, notification);
}else{
NotificationManager mNotificationManager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(activity);
Notification notification = builder.getNotification();
notification.icon = R.drawable.icon;
RemoteViews contentView = new RemoteViews(activity.getPackageName(), R.layout.custom_notification);
notification.contentView = contentView;
notification.flags |= Notification.FLAG_ONGOING_EVENT;
contentView.setTextViewText(R.id.title, "Browser");
contentView.setTextViewText(R.id.desc, "This is a description. - PAUSED");
contentView.setImageViewResource(R.id.pausePlay, R.drawable.play);
PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(activity, 0, new Intent(activity, NotificationPausePlay.class), 0);
contentView.setOnClickPendingIntent(R.id.pausePlay, pendingSwitchIntent);
mNotificationManager.notify(99, notification);
}
}
}
将其放入NotificationPausePlay.java
public class NotificationPausePlay extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
Log.e("Here", "I am here");
if(playing){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
wv.evaluateJavascript("videoElement.pause();", null);
}else{
wv.loadUrl("javascript:videoElement.pause();");
}
NotificationManager mNotificationManager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(activity);
Notification notification = builder.getNotification();
notification.icon = R.drawable.icon;
RemoteViews contentView = new RemoteViews(activity.getPackageName(), R.layout.custom_notification);
notification.contentView = contentView;
notification.flags |= Notification.FLAG_ONGOING_EVENT;
contentView.setTextViewText(R.id.title, "Browser");
contentView.setTextViewText(R.id.desc, "This is a description. - PAUSED");
contentView.setImageViewResource(R.id.pausePlay, R.drawable.play);
PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(activity, 0, new Intent(activity, NotificationPausePlay.class), 0);
contentView.setOnClickPendingIntent(R.id.pausePlay, pendingSwitchIntent);
mNotificationManager.notify(99, notification);
playing = false;
}else{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
wv.evaluateJavascript("videoElement.play();", null);
}else{
wv.loadUrl("javascript:videoElement.play();");
}
NotificationManager mNotificationManager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(activity);
Notification notification = builder.getNotification();
notification.icon = R.drawable.icon;
RemoteViews contentView = new RemoteViews(activity.getPackageName(), R.layout.custom_notification);
notification.contentView = contentView;
notification.flags |= Notification.FLAG_ONGOING_EVENT;
contentView.setTextViewText(R.id.title, "Browser");
contentView.setTextViewText(R.id.desc, "This is a description. - PLAYING");
contentView.setImageViewResource(R.id.pausePlay, R.drawable.play);
PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(activity, 0, new Intent(activity, NotificationPausePlay.class), 0);
contentView.setOnClickPendingIntent(R.id.pausePlay, pendingSwitchIntent);
mNotificationManager.notify(99, notification);
playing = true;
}
}
}
将其放入 custom_notification.xml
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:background="#e6e6e6">
<ImageView
android:layout_width="45dp"
android:layout_height="45dp"
android:id="@+id/icon"
android:src="@drawable/icon"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginRight="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
android:textSize="16dp"
android:textStyle="bold"
android:textColor="#000000"
android:singleLine="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/icon"
android:layout_toEndOf="@+id/icon"
android:layout_toLeftOf="@+id/pausePlay"
android:layout_toStartOf="@+id/pausePlay" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/desc"
android:textSize="16dp"
android:textColor="#5f5f5f"
android:singleLine="true"
android:layout_below="@+id/title"
android:layout_toRightOf="@+id/icon"
android:layout_toEndOf="@+id/icon"
android:layout_toLeftOf="@+id/pausePlay"
android:layout_toStartOf="@+id/pausePlay"/>
<ImageButton
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/pausePlay"
android:scaleType="fitXY"
android:background="#e6e6e6"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
将其添加到 WebView
wv.setWebChromeClient(new webChromeClient());
wv.addJavascriptInterface(new JSInterface(), "JSOUT");
将其添加到 下的 list 中
<receiver android:name=".NotificationPausePlay" />
关于android-studio - 带有 html <audio> 元素的 WebView 应用程序 - 可以在通知区域中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834549/