首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Android在后台播放YouTube?

如何使用Android在后台播放YouTube?
EN

Stack Overflow用户
提问于 2019-01-17 13:11:07
回答 1查看 1.7K关注 0票数 2

我希望“最小化”应用程序,让它处于后台,这样做与当用户单击按钮(但不完成)时按下幽灵按钮模式时所做的完全相同--我怎么做呢?

到目前为止,我能够创建一个Activity。我已经初始化了我的成员,并用“WebView”加载了https://www.youtube.com。我还可以创建一个Service,它允许我最小化Activity,但我想要的是最小化已经加载的WebView问题Activity暂停时,WebView也暂停。

我现在想要的

  1. 鬼模式->基本上是最小化当前活动的系统覆盖,并显示对媒体控件的通知,可以播放/恢复和退出鬼模式。
  2. 一个对我可见的MainActivity,它只会成为服务器,并在按下鬼影模式btn后向我显示Notification控件。

,我到目前为止处理的事情,

屏幕方向,意味着Activity不重新创建WebView。如果我在看一些视频,它只是暂停屏幕方向的视频。

我想要什么答案

  1. 我能让我现在的Activity成为一项服务吗?
  2. 如果不是,我可以创建一个SplashActivity来打开这个make MainActivity,然后按一下按钮使这个Service

AndroidManifest.xml

代码语言:javascript
复制
<service android:enabled="true" android:name=".Services.GhostModeService" />

 android:hardwareAccelerated="true"

<activity android:name=".MainActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:label="@string/app_name"
            android:launchMode="singleInstance">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

MainActivity

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG,"classmain-> onCreate");
    initializeM();
    settingWebview();
    initializeNavigationTab();
    myoutube.loadUrl(URL);
    ghostModeServiceIntent=new Intent(MainActivity.this,GhostModeService.class);
}

,这些是我的设置.

代码语言:javascript
复制
private void settingWebview() {
        myoutube.setWebViewClient(new Myyoutube());
        myoutube.getSettings().setLoadsImagesAutomatically(true);
        myoutube.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        myoutube.getSettings().setBuiltInZoomControls(false);
        myoutube.getSettings().setLoadsImagesAutomatically(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
            myoutube.getSettings().setMediaPlaybackRequiresUserGesture(true);
        myoutube.getSettings().setJavaScriptEnabled(true);
        myoutube.getSettings().setPluginState(WebSettings.PluginState.ON);
    }

GhostmodeService

代码语言:javascript
复制
 private WindowManager mWindowManager;
 private View mGhostmode;

@Override
    public void onCreate() {
    super.onCreate();

    Log.d(TAG,"classghostservice-> onCreate()");
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    mGhostmode = inflater.inflate(R.layout.layout_ghostmode,null,false);

    //setting the layout parameters
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            500,
            500,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    params.x=0;
    params.y=0;
    params.gravity=Gravity.END | Gravity.BOTTOM;


    //getting windows services and adding the floating view to it
    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    mWindowManager.addView(mGhostmode, params);

}

方法,该方法创建通知。此通知将恢复MainActivity

代码语言:javascript
复制
@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG,"classghostservice-> onstartCommand()");
        foregroundNotification(1);
        return START_NOT_STICKY;

    }
EN

回答 1

Stack Overflow用户

发布于 2019-01-22 22:17:41

解决了一个星期后,我能够回答这个期待已久的问题,如何在后台使用Webview运行Youtube。是的,webview需要UI来运行我们不能在后台使用服务运行它,即使你找到了你的方式,你仍然会遇到问题。

巧妙的技巧如下:

  1. 是的,您需要添加android.permission.SYSTEM_ALERT_WINDOW,因为您想要使一个浮动窗口保持在其他应用程序之上。
  2. 假设您已经请求了许可并准备好启动MainActivity,此时请忘记setContentView(R.layout.activity_main);,而需要使用windowManager.addView(yourLayout, yourWindowParams);WindowManager中添加布局

activity_main.xml

在我的布局中,我的父布局是DrawerLayout

代码语言:javascript
复制
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent".....

因此,我必须定义我的成员变量如下

代码语言:javascript
复制
private static DrawerLayout windowMain;

MainActivity

代码语言:javascript
复制
 windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
 inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
 windowMain = (DrawerLayout) inflater.inflate(R.layout.activity_main, null);
  1. 现在主要的部分是通过使用这个windowMain,您必须调用 findViewById()

eg

代码语言:javascript
复制
windowMain.findViewById(R.id.btn);
windowMain.findViewById(R.id.webview);
  1. 您还需要定义它的WindowManager.LayoutParams。初始化参数。 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,PixelFormat.TRANSLUCENT( WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT);expandParams.gravity = Gravity.START WindowManager.LayoutParams.MATCH_PARENT Gravity.TOP;expandParams.x = 0;expandParams.y = 0;
  2. 最后,需要通过以下方式将windowMain及其参数添加到windowManager中 windowManager.addView(windowMain,expandParams);

所有这些都是为了使窗口在周围浮动并占据整个屏幕,然后做您需要做的事情,比如使用URL在webview中加载wv.loadURL(url)。这确保了我们已经在窗口中加载了我们的we视图,我们只需要更新我们的windowMain w:0 的参数,这样就可以通过设置w:0 h:0 而不是 MATCH_PARENT来最小化它,甚至完全消失。

您可以拥有一个更新窗口的btn_ghost,如:

代码语言:javascript
复制
windowManager.updateViewLayout(windowMain, ghostParams);
  1. 最后,当我们创建了这个创建后,我们可以调用moveTaskToBack(true); --这将停止活动,将它移动到任务,因为我们不需要它。当完成创建但停止的活动时,我们必须删除windowMain。 windowManager.removeView(windowMain);finish()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54236715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档