Как играть в YouTube в фоновом режиме с Android Webview? - PullRequest
0 голосов
/ 17 января 2019

Я хочу «свернуть» приложение, оставив его в фоновом режиме, точно так же, как при нажатии режима ghostbutton, когда пользователь нажимает кнопку (но не заканчивает ее). Как я могу это сделать?

Пока я могу создать Activity. Я инициализирую своих участников и загружаю WebView с помощью "https://www.youtube.com".. Я также могу создать Service, который позволяет мне минимизировать Activity, но я хочу минимизировать Activity * что я загрузил WebView. Проблема Когда Activity приостановлен, WebView также приостановлен.

Что я хочу сейчас.

  1. Режим призрака -> в основном минимизирует эту текущую активность с наложение системы и отображение уведомлений для элементов управления мультимедиа, которые могут Воспроизведение / возобновление и выход из режима призрака.
  2. A MainActivity, который виден мне и становится только служением и покажи мне Notification управление после нажатия ghostmode btn

То, что я обработал до сих пор

Ориентация экрана, то есть Activity не воссоздает WebView. Если я смотрю какое-то видео, оно просто останавливает видео в ориентации экрана.

Какие ответы я хочу

  1. Могу ли я сделать свой текущий Activity сервисом?
  2. Если нет, могу ли я просто создать SplashActivity, который открывает этот маркер MainActivity и сделать это Service по нажатию кнопки.

AndroidManifest.xml

<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

@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);
}

Это мои настройки.

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

 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.

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG,"classghostservice-> onstartCommand()");
        foregroundNotification(1);
        return START_NOT_STICKY;

    }

1 Ответ

0 голосов
/ 23 января 2019

[решено] Через неделю я могу ответить на этот долгожданный вопрос Как запустить Youtube в фоновом режиме, используя Webview . Да, веб-просмотр требует, чтобы пользовательский интерфейс запускался, мы не можем запустить его в фоновом режиме, используя службу, даже если вы все же найдете свой путь, у вас все равно будут проблемы.

Умные трюки заключаются в следующем:

  1. Да, вам нужно добавить android.permission.SYSTEM_ALERT_WINDOW, потому что вы хотите создать плавающее окно, которое останется поверх других приложений.

  2. Допустим, вы запросили разрешение и готовы начать MainActivity, на данный момент забудьте о setContentView(R.layout.activity_main);, вместо этого вам нужно добавить свой макет в WindowManager, используя windowManager.addView(yourLayout, yourWindowParams);

activity_main.xml

В моем макете мой родительский макет был DrawerLayout

<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".....

Итак, я должен был определить мою переменную-член следующим образом

private static DrawerLayout windowMain;

MainActivity

 windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
 inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
 windowMain = (DrawerLayout) inflater.inflate(R.layout.activity_main, null);
  1. Теперь основная часть с помощью этого windowMain, вам нужно позвонить

     findViewById()
    

например

windowMain.findViewById(R.id.btn);
windowMain.findViewById(R.id.webview);
  1. Вам также нужно определить его WindowManager.LayoutParams. Инициализация параметров.

    WindowManager.LayoutParams=expandParams
    expandParams = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON|
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);
    expandParams.gravity = Gravity.START | Gravity.TOP;
    expandParams.x = 0;
    expandParams.y = 0;
    
  2. Наконец, вам нужно добавить windowMain и его параметры в windowManager с помощью

      windowManager.addView(windowMain, expandParams);
    

Все сделано для того, чтобы сделать окно, которое всплывает и занимает весь экран, а затем делайте то, что вам нужно, например, загружая URL в веб-просмотр, используя wv.loadURL(url). Это гарантирует, что мы загрузили наше веб-представление внутри окна и нам просто нужно обновить параметры нашего windowMain, чтобы он минимизировал его или даже полностью исчез, установив w:0 и h:0 вместо MATCH_PARENT

У вас может быть btn_ghost, которое обновляет окно, например:

windowManager.updateViewLayout(windowMain, ghostParams);
  1. Наконец, когда мы создали это созданное, мы можем вызвать moveTaskToBack(true);, что остановит активность, переместит ее в задачу, потому что она нам не нужна. При завершении этого действия, которое было создано, но остановлено, мы должны удалить наш windowMain.

      windowManager.removeView(windowMain);
      finish()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...