Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自動進入PIP Mode

接上文 Flutter PIP 插件 ---- Android

項目地址 PIP, pub.dev也已經同步發布 pip 0.0.3,你的加星和點贊,將是我繼續改進最大的動力

開發文檔 Add videos using picture-in-picture (PiP)介紹PIP功能從 Android 8.0 (API level 26) 引入,但是autoEnter功能從 Android 12 才開始支持,那么不支持的版本呢就需要通過監聽 onUserLeaveHint 主動調用 enterPictureInPictureMode 才能進入 PIP Mode,在之前的版本中因為 FlutterActivity 沒有轉發 onUserLeaveHint,導致我們只能在 dart 中通過 flutterdidChangeAppLifecycleState 事件,在應用進入后臺是主動調用的方式進入PIP Mode,但實際測下來,似乎無法區分通知欄下滑的通知,這導致即使應用在前臺,當用戶下滑通知欄的時候依然會自動進入PIP Mode, 這顯然不是我們想要的,優化后的效果如下:

請添加圖片描述

修改PIP插件

  • 新增PipActivity

    package org.opentraa.pip;import android.app.PictureInPictureUiState;
    import android.content.res.Configuration;
    import android.os.Build;
    import androidx.annotation.NonNull;
    import androidx.annotation.RequiresApi;
    import io.flutter.embedding.android.FlutterActivity;@RequiresApi(Build.VERSION_CODES.O)
    public class PipActivity extends FlutterActivity {public interface PipActivityListener {void onPictureInPictureModeChanged(boolean isInPictureInPictureMode,Configuration newConfig);void onPictureInPictureUiStateChanged(PictureInPictureUiState state);boolean onPictureInPictureRequested();void onUserLeaveHint();}private PipActivityListener mListener;public void setPipActivityListener(PipActivityListener listener) {mListener = listener;}// only available in API level 26 and above@RequiresApi(26)@Overridepublic void onPictureInPictureModeChanged(boolean isInPictureInPictureMode,Configuration newConfig) {super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);if (mListener != null) {mListener.onPictureInPictureModeChanged(isInPictureInPictureMode,newConfig);}}// only available in API level 30 and above@RequiresApi(30)@Overridepublic boolean onPictureInPictureRequested() {if (mListener != null) {return mListener.onPictureInPictureRequested();}return super.onPictureInPictureRequested();}// only available in API level 31 and above@RequiresApi(31)@Overridepublic voidonPictureInPictureUiStateChanged(@NonNull PictureInPictureUiState state) {super.onPictureInPictureUiStateChanged(state);if (mListener != null) {mListener.onPictureInPictureUiStateChanged(state);}}@Overridepublic void onUserLeaveHint() {super.onUserLeaveHint();if (mListener != null) {mListener.onUserLeaveHint();}}
    }
    

    主要思路就是如果PIP 插件的用戶想要在 Android 12 以下支持應用進入后臺自動進入 PIP Mode 的話,可以將自己 MainActivity 的父類修改為 PipActivity ,這樣在 PIP 插件被注冊時,可以通過判斷傳入的 Activity 是否是 PipActivity 來決定是否啟用相關的功能。

  • 綁定 ActivityPipController
    PipPluginonAttachedToActivityonReattachedToActivityForConfigChanges 的時候去初始化 PipController

    private void initPipController(@NonNull ActivityPluginBinding binding) {if (pipController == null) {pipController = new PipController(binding.getActivity(), new PipController.PipStateChangedListener() {@Overridepublic void onPipStateChangedListener(PipController.PipState state) {// put state into a json objectchannel.invokeMethod("stateChanged",new HashMap<String, Object>() {{ put("state", state.getValue()); }});}});} else {pipController.attachToActivity(binding.getActivity());}
    }@Override
    public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {initPipController(binding);
    }@Override
    public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {initPipController(binding);
    }
    
  • PipController 構造函數和 attachToActivity 方法中去綜合當前的系統版本和綁定的 Activity 進行檢查是否支持 autoEnter

    public PipController(@NonNull Activity activity,@Nullable PipStateChangedListener listener) {setActivity(activity);//  ... Other code ...
    }private boolean checkAutoEnterSupport() {// Android 12 and above support to set auto enter enabled directlyif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {return true;}// For android 11 and below, we need to check if the activity is kind of// PipActivity since we can enter pip mode when the onUserLeaveHint is// called to enter pip mode as a workaroundActivity activity = mActivity.get();return activity instanceof PipActivity;
    }private void setActivity(Activity activity) {mActivity = new WeakReference<>(activity);if (activity instanceof PipActivity) {((PipActivity)activity).setPipActivityListener(this);}mIsSupported = checkPipSupport();mIsAutoEnterSupported = checkAutoEnterSupport();
    }public void attachToActivity(@NonNull Activity activity) {setActivity(activity);
    }
    

修改Example項目中的MainActivity

  • 孤伶伶的MainActivity
    package org.opentraa.pip_example;import io.flutter.embedding.android.FlutterActivity;
    import org.opentraa.pip.PipActivity;public class MainActivity extends PipActivity {
    }
    

如上,至此我們已經支持了全部版本的 PIP Mode autoEnter 功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78016.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java開發日記】6個Java 工具,輕松分析定位 JVM 問題 !

目錄 使用 JDK 自帶工具查看 JVM 情況 jps jinfo jvisualvm jcm 使用 JDK 自帶工具查看 JVM 情況 JDK 自帶了很多命令行甚至是圖形界面工具&#xff0c;幫助查看 JVM 的一些信息。比如&#xff0c;在機器上運行 ls 命令&#xff0c;可以看到 JDK 8 提供了非常多的工具或程…

動態規劃簡單題2

leetcode91題&#xff08;解碼方法&#xff09; 分析題目&#xff1a; 1.這是一種解碼&#xff0c;就是給多個數字組成的字符串&#xff0c;把這些數字解碼成字母&#xff0c;看看一共有多少種 2.如果一個數字前有前導0就不合法&#xff0c;比如06&#xff0c;這與6不同&…

(007)Excel 公式的使用

文章目錄 邏輯運算公式的參數常用函數引用方式引用工作表和工作簿表格的引用修改公式的計算時機區域交叉引用 邏輯運算 公式的參數 單元格引用&#xff1a;SUM(A1:A24)。字面值&#xff1a;SQRT(121)。字面文本字符串&#xff1a;PROPER(“john.f.smith”)。表達式&#xff1a…

Unity 和 Unreal Engine(UE) 兩大主流游戲引擎的核心使用方法

以下是 Unity 和 Unreal Engine&#xff08;UE&#xff09; 兩大主流游戲引擎的核心使用方法和對比分析&#xff0c;幫助開發者快速上手并根據項目需求選擇合適工具&#xff1a; 一、Unity 使用指南 1. 安裝與配置 安裝&#xff1a;從 Unity Hub 下載&#xff0c;選擇長期支持…

猜數字游戲:從數學原理到交互體驗的完整設計指南

目錄 猜數字游戲&#xff1a;從數學原理到交互體驗的完整設計指南引言第一章 游戲數學原理1.1 均勻分布與隨機生成1.2 最優猜測策略 第二章 游戲系統設計2.1 核心架構2.2 動態難度系統 第三章 交互設計細節3.1 輸入驗證系統3.2 漸進式提示機制 第四章 進階功能設計4.1 智能輔導…

2025工業大模型白皮書 | 螞蟻工廠北京航空航天大學聯合出品

由螞蟻工廠與北京航空航天大學聯合發布的《2025工業大模型白皮書》是一部針對工業領域大模型技術發展的前瞻性研究報告。該白皮書系統梳理了工業大模型的技術演進、核心應用場景、關鍵挑戰及未來發展趨勢&#xff0c;旨在為制造業數字化轉型提供理論支撐和實踐指南。作為產學研…

JavaWeb:后端web基礎(TomcatServletHTTP)

一、今日內容 二、Tomcat 介紹與使用 介紹 基本使用 小結 配置 配置 查找進程 三、Servlet 什么是Servlet 快速入門 需求 步驟 1.新建工程-模塊&#xff08;Maven&#xff09; 2.修改打包方式-war 3.編寫代碼 /*** 可以選擇繼承HttpServlet*/ WebServlet("/hello&q…

構建現代分布式云架構的三大支柱:服務化、Service Mesh 與 Serverless

目錄 前言1. 服務化架構模式&#xff1a;構建可擴展的基礎單元1.1 服務化的定義與演進1.2 在分布式云中的價值1.3 面臨的挑戰 2. Service Mesh 架構&#xff1a;服務通信的治理中樞2.1 什么是 Service Mesh&#xff1f;2.2 功能與優勢2.3 在分布式云中的角色2.4 落地難點 3. Se…

嵌入式C語言的運算符與輸入輸出

目錄 1. 運算符 1.1 位運算符 1.1.1 位運算 ~ 1.1.2 位邏輯與 & 1.1.3 位邏輯或 | 1.1.4 位邏輯異或 ^ 1.1.5 位移位運算 1.1.6 將無符號位的某位快速置 1 1.2 三目運算符 1.3 逗號運算符 1.4 運算符優先級 2. 輸出 2.1 字符輸出函數 2.2 格式輸出函數 2.3 字符…

IPD研學:76頁頁基于IPD思想-華為需求管理培訓方案【附全文閱讀】

適應人群 本方案適用于企業中參與產品研發、市場、銷售、項目管理等部門的人員,尤其是負責需求管理工作的相關從業者;致力于提升產品競爭力,對優化需求管理流程、提高產品開發質量感興趣的企業管理者;以及希望了解行業前沿需求管理方法,尋求突破和創新的相關人士。…

米酒的功能和優缺點

米酒&#xff08;又稱甜酒、酒釀&#xff09;是一種以糯米或其他谷物為原料&#xff0c;經發酵制成的傳統發酵飲品&#xff0c;酒精度較低&#xff08;通常1%-10%&#xff09;。以下是其功能、優點及缺點分析&#xff1a; 一、米酒的功能 營養補充 富含B族維生素&#xff08;B1…

注冊登錄頁面項目

關系型數據庫地址&#xff1a;C:\Users\ASUS\AppData\Local\Temp\HuaweiDevEcoStudioDatabases\rdb #注冊頁面register.ets import dataRdb from ohos.data.rdbconst STORE_CONFIG {name: weather4.db } const TABLE_NAME weather_info const SQL_CREATE_TABLE CREATE TAB…

yum源配置文件CentOS-Base.repo完整內容

1.CentOS Yum 源配置文件 CentOS-Base.repo 的完整內容示例&#xff1a; 以下是適用于不同版本 CentOS 系統的 CentOS-Base.repo 文件的標準模板。這些模板基于常見的國內鏡像源&#xff08;如阿里云、清華大學等&#xff09;&#xff0c;可以幫助解決倉庫配置失敗的問題。 適…

深度學習基礎--目標檢測入門簡介

博主簡介&#xff1a;努力學習的22級本科生一枚 &#x1f31f;? 博客主頁&#xff1a;羊小豬~~-CSDN博客 內容簡介&#xff1a;探索AI算法&#xff0c;C&#xff0c;go語言的世界&#xff1b;在迷茫中尋找光芒?&#x1f338;? 往期回顧&#xff1a;yolov5基礎–一步一步教…

雅思寫作--70個高頻表達

文章目錄 1. learn new skills學生通過戶外活動學到很多新技2. take immediate action to do各國采取有效行動以保護環境政府采取了必要行動以減少失業。你應該立即采取行動來解3. communication skills4. grow significantly5. have many advantages1. learn new skills “lea…

深入理解虛擬機與容器:原理、對比與應用場景分析

目錄 前言1 虛擬機技術詳解1.1 虛擬機的基本原理1.2 虛擬機的優勢與局限 2 容器技術詳解2.1 容器的運行機制2.2 容器的優勢與局限 3 虛擬機與容器的核心差異對比3.1 架構對比3.2 啟動速度與資源消耗3.3 安全性與隔離性3.4 兼容性與遷移性 4 實際應用場景分析4.1 適合使用虛擬機…

SQL Server數據庫提權的幾種方法——提權教程

SQL Server數據庫提權的幾種方法——提權教程 一、簡介 在利用系統溢出漏洞沒有效果的情況下,可以采用數據庫進行提權。 數據庫提權的前提條件: 1、服務器開啟數據庫服務 2、獲取到最高權限用戶密碼 (除Access數據庫外,其他數據庫基本都存在數據庫提權的可能) 二、使用x…

【第19節 信息加解密技術】

本章目錄: 一、節概述二、知識詳解1. 信息加密的基本分類2. 對稱加密算法詳解3. 非對稱加密算法詳解4. 密鑰控制技術5. 密鑰分發機制6. 公鑰體系的密鑰管理機制7. 密鑰分類與生成 三、關鍵點提煉四、考試提示五、總結與建議 一、節概述 在信息安全體系中&#xff0c;信息加解密…

記錄搭建自己的應用中心-需求看板搭建

記錄搭建自己的應用中心-需求看板搭建 人員管理新增用戶組織用戶登錄和操作看板狀態看板任務通知任務詳情 人員管理 由于不是所有人都有應用管理權限&#xff0c;所以額外做了一套應用登錄權限&#xff0c;做了一個新的組織人員表&#xff0c;一個登錄賬戶下的所有應用人員共享…

Java從入門到精通 - Java入門

Java 入門 此筆記參考黑馬教程&#xff0c;僅學習使用&#xff0c;如有侵權&#xff0c;聯系必刪 文章目錄 Java 入門01 Java快速入門1. Java 是什么&#xff1f;能干什么&#xff1f;1.1 Java 背景知識1.2 Java 能做什么&#xff1f;1.3 Java 技術體系 2. 如何使用 Java&…