語言

ContentCaptureManager 類別

定義

提供應用程式與內容擷取子系統整合的額外方式。

[Android.Runtime.Register("android/view/contentcapture/ContentCaptureManager", ApiSince=29, DoNotGenerateAcw=true)]
public sealed class ContentCaptureManager : Java.Lang.Object
[<Android.Runtime.Register("android/view/contentcapture/ContentCaptureManager", ApiSince=29, DoNotGenerateAcw=true)>]
type ContentCaptureManager = class
    inherit Object
繼承
ContentCaptureManager
屬性

備註

提供應用程式與內容擷取子系統整合的額外方式。

內容擷取提供即時、持續的應用程式活動、顯示與事件捕捉,供由 Android 系統提供的情報服務使用。 情報機構接著利用這些資訊來調解並加速使用者在不同應用程式中的體驗。 例如,當使用者在聊天應用程式中收到餐廳地址,並切換到地圖應用程式搜尋該餐廳時,情報服務可以提供自動填充對話框,讓使用者自動選擇地址。

內容擷取的設計時,主要考量為隱私與效能。

<ul><li><b>隱私:</b> 情報服務是由裝置製造商提供的受信任元件,使用者無法更改(但使用者可透過 Android 設定應用程式全域關閉內容擷取)。 此服務只能將資料用於裝置內機器學習,這同時受到流程隔離與 CDD 要求的強制執行。 <li><b>效能:</b> 內容擷取經過高度優化,以減少對應用程式抖動及整體裝置系統健康的影響。 例如,它只會在情報機構明確允許的應用程式(甚至特定應用程式活動)上啟用,並且會緩衝事件,讓它們成批次送回情報機構(請參考 #isContentCaptureEnabled() 其他關閉時的情況)。 </ul>

事實上,在使用這個管理器之前,應用程式開發者應該先確認它是否可用。 範例:

<code>
             ContentCaptureManager mgr = context.getSystemService(ContentCaptureManager.class);
             if (mgr != null && mgr.isContentCaptureEnabled()) {
               // ...
             }
</code>

應用程式開發者通常不需要明確與內容擷取互動,除非應用程式:

<ul><li>可以定義一個情境來 android.content.LocusId 識別唯一狀態(例如兩位聊天用戶之間的對話)。 <li>可以有多個具有不同上下文意義的視圖階層(例如,一個瀏覽器應用程式有多個分頁,每個分頁代表不同的網址)。 <li>包含自訂視圖(可直接擴展視圖,標準 Android SDK 不提供)。 <li>包含提供自身虛擬階層的檢視(例如利用 Canvas 渲染 HTML 元素的網頁瀏覽器)。 </ul>

內容擷取的主要整合點是 ContentCaptureSession。 當啟用內容擷取並被標準 Android 檢視時,Android 系統會自動建立「主」會話,以通知內容擷取服務新增視圖、移除視圖及使用者輸入文字變更等事件。 會話可以提供 ContentCaptureContext 更多上下文資訊,例如與視圖階層相關的位置(詳見 android.content.LocusId 更多關於位置的資訊)。 預設情況下,主會話沒有 ContentCaptureContext,但建立後你可以更改。 範例:

<code>
            protected void onCreate(Bundle savedInstanceState) {
              // Initialize view structure
              ContentCaptureSession session = rootView.getContentCaptureSession();
              if (session != null) {
                session.setContentCaptureContext(ContentCaptureContext.forLocusId("chat_UserA_UserB"));
              }
            }
</code>

如果你的活動包含具有不同上下文意義的視圖階層,你應該為每個視圖階層根建立子會話。 舉例來說,如果你的活動是瀏覽器,你可以用主會話來呈現主要 URL,然後用子會話對應每個 IFRAME:

<code>
            ContentCaptureSession mMainSession;

            protected void onCreate(Bundle savedInstanceState) {
               // Initialize view structure...
               mMainSession = rootView.getContentCaptureSession();
               if (mMainSession != null) {
                 mMainSession.setContentCaptureContext(
                     ContentCaptureContext.forLocusId("https://example.com"));
               }
            }

            private void loadIFrame(View iframeRootView, String url) {
              if (mMainSession != null) {
                 ContentCaptureSession iFrameSession = mMainSession.newChild(
                     ContentCaptureContext.forLocusId(url));
                 }
                 iframeRootView.setContentCaptureSession(iFrameSession);
              }
              // Load iframe...
            }
</code>

如果你的活動有自訂視圖(也就是直接延伸 View 且只提供一個邏輯視圖,而非虛擬樹狀結構),且提供的內容對內容擷取有關聯(截至目前 android.os.Build.VERSION_CODES#Q Android Q,唯一相關的內容是文字),那麼你的視圖實作應該:

<ul><li>將其視為內容擷取的重要。 <Li>Fill ViewStructure 用於內容擷取。 <當使用者輸入更改文字時,通知>。ContentCaptureSession </ul>

以下是 -類視圖相關方法 EditText的範例:

<code>
            public class MyEditText extends View {

            public MyEditText(...) {
              if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) {
                setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES);
              }
            }

            public void onProvideContentCaptureStructure(@NonNull ViewStructure structure, int flags) {
              super.onProvideContentCaptureStructure(structure, flags);

              structure.setText(getText(), getSelectionStart(), getSelectionEnd());
              structure.setHint(getHint());
              structure.setInputType(getInputType());
              // set other properties like setTextIdEntry(), setTextLines(), setTextStyle(),
              // setMinTextEms(), setMaxTextEms(), setMaxTextLength()
            }

            private void onTextChanged() {
              if (isLaidOut() && isImportantForContentCapture() && isTextEditable()) {
                ContentCaptureManager mgr = mContext.getSystemService(ContentCaptureManager.class);
                if (cm != null && cm.isContentCaptureEnabled()) {
                   ContentCaptureSession session = getContentCaptureSession();
                   if (session != null) {
                     session.notifyViewTextChanged(getAutofillId(), getText());
                   }
              }
            }
</code>

如果你的視圖提供自己的虛擬階層(例如瀏覽器用不同渲染流程繪製 HTML Canvas ,或是原生函式庫),那麼視圖也會在虛擬元素出現或消失時通知會話——詳情請見 View#onProvideContentCaptureStructure(ViewStructure, int) 。

Java 文件 android.view.contentcapture.ContentCaptureManager。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

欄位

名稱 Description
DataShareErrorConcurrentRequest
已淘汰.

申請已被拒絕,因為同時進行資料共享會話。

DataShareErrorTimeoutInterrupted
已淘汰.

請求因資料共享會話逾時而中斷。

DataShareErrorUnknown
已淘汰.

錯誤發生在資料共享會話中。

屬性

名稱 Description
Class

回傳此 Object的執行時類別。

(繼承來源 Object)
ContentCaptureConditions

取得允許內容擷取的條件清單。

ContentCaptureEnabled

檢查此活動是否啟用內容擷取。 -或- 應用程式呼叫來明確啟用或關閉內容擷取。

Handle

底層 Android 實例的帳號。

(繼承來源 Object)
JniIdentityHashCode

取得由互通執行時指派給此 Java 對等端的身份雜湊碼。

(繼承來源 Object)
JniManagedPeerState

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
JniPeerMembers

提供應用程式與內容擷取子系統整合的額外方式。

PeerReference

取得這個 Java 節點的 JNI 物件參考。

(繼承來源 Object)
ServiceComponentName

回傳正在為目前使用者消耗擷取事件的系統服務元件名稱。

ThresholdClass

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

(繼承來源 Object)
ThresholdType

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

(繼承來源 Object)

方法

名稱 Description
Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
Dispose()

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
Dispose(Boolean)

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
DisposeUnlessReferenced()

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
Equals(Object)

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
JavaFinalize()
已淘汰.

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

(繼承來源 Object)
RemoveData(DataRemovalRequest)

應用程式呼叫內容擷取服務移除與某些上下文相關的內容擷取資料。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
ShareData(DataShareRequest, IExecutor, IDataShareWriteAdapter)

應用程式呼叫它,透過寫入檔案來請求資料共享。

ToArray<T>()

從這個 Java 陣列包裝器建立一個受管理陣列。

(繼承來源 Object)
ToString()

回傳物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

將此 Java 節點從互通執行時中取消註冊。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

(繼承來源 Object)
Wait(Int64, Int32)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
IJavaPeerable.Finalized()

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

提供應用程式與內容擷取子系統整合的額外方式。

(繼承來源 JavaObject)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

提供應用程式與內容擷取子系統整合的額外方式。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於