<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### **[Android 4.4 API](https://developer.android.com/about/versions/android-4.4.html)** API 級別:19 Android 4.4 (KITKAT) 是新的 Android 平臺版本,為用戶和應用開發者提供了新功能。本文旨在介紹其中最值得關注的新 API。 作為應用開發者,您應盡快從 SDK 管理器下載 Android 4.4 系統映像和 SDK 平臺。如果您沒有運行 Android 4.4 的設備來測試您的應用,請使用 Android 4.4 系統映像在 Android 模擬器上測試您的應用。然后,基于 Android 4.4 平臺開發應用以開始使用最新的 API。 #### **更新目標 API 級別** 要進一步優化您的應用在運行 Android 4.4 的設備上的性能,應將您的 targetSdkVersion 設置為 "19",在 Android 4.4 系統映像上安裝您的應用并進行測試,然后發布此變更的更新。 您可以通過在代碼中添加條件,在執行您的 minSdkVersion 不支持的 API 之前檢查系統 API 級別,實現在使用 Android 4.4 中的 API 的同時仍為舊版本提供支持。要詳細了解如何保持向后兼容性,請閱讀支持不同平臺版本。 如需了解有關 API 級別工作方式的詳細信息,請閱讀什么是 API 級別? #### **重要的行為變更** 如果您之前發布過 Android 應用,請注意您的應用可能受到 Android 4.4 變化的影響。 **如果您的應用從外部存儲空間讀取...** 您的應用在 Android 4.4 上運行時無法讀取外部存儲空間上的共享文件,除非您的應用具有 READ_EXTERNAL_STORAGE 權限。也就是說,沒有此權限,您無法再訪問 getExternalStoragePublicDirectory() 返回的目錄中的文件。但是,如果您僅需要訪問 getExternalFilesDir() 提供的您的應用特有目錄,那么,您不需要 READ_EXTERNAL_STORAGE 權限。 **如果您的應用使用 WebView...** 在 Android 4.4 上運行時,您的應用的行為會有所不同,將應用的 targetSdkVersion 更新為“19”或更高版本時尤其如此。 WebView 類的底層代碼和相關 API 已升級為基于現代的 Chromium 源代碼快照。這會帶來各種性能提升,同時為新的 HTML5 功能和遠程調試 WebView 內容提供支持。此次升級的范圍意味著如果您的應用使用 WebView,則在某些情況下其行為可能會受影響。盡管對已知的行為變更進行了記錄,但僅在您將應用的 targetSdkVersion 更新為“19”或更高版本時這些變更才會對應用產生很大的影響—新的 WebView 在“兼容模式”中運行以便在面向 API 級別 18 和更低級別的應用中提供部分舊功能—您的應用有可能依賴來自以前的 WebView 版本的未知行為。 因此,如果您的現有應用使用 WebView,則務必盡快在 Android 4.4 上進行測試,并查閱遷移到 Android 4.4 中的 WebView,以了解將 targetSdkVersion 更新為“19”或更高版本時對應用可能產生怎樣的影響。 **如果您的應用使用 AlarmManager...** 將您的應用的 targetSdkVersion 設置為“19”或更高版本時,您使用 set() 或 setRepeating() 創建的鬧鈴將變得不準確。 為提高電源效率,Android 現在批處理在合理的相似時間發生的所有應用的鬧鈴,以便系統僅喚醒設備一次,而不是多次喚醒設備來處理每個鬧鈴。 如果您的鬧鈴沒有與精確的時鐘時間關聯,但您的鬧鈴仍必須在特定時間范圍(例如,在下午 2 點至 4 點之間)觸發,那么您可以使用新的 setWindow() 方法,其接受鬧鈴的“最早”時間以及最早時間之后的一個時間“窗口”,在這個窗口內,系統應觸發鬧鈴。 如果您的鬧鈴必須固定到一個精確的時鐘時間(例如,日歷事件提醒),那么您可以使用新的 setExact() 方法。 這個精確的批處理行為僅適用于更新后的應用。如果您已將 targetSdkVersion 設置為“18”或更低版本,那么在 Android 4.4 上運行時,您的鬧鈴的行為方式和在以前版本上一樣。 **如果您的應用使用 ContentResolver 同步數據...** 將應用的 targetSdkVersion 設置為“19”或更高版本時,使用 addPeriodicSync() 創建同步將在默認的 Flex 間隔內(在您指定期間的 4% 左右)執行您的同步操作。例如,如果您的輪詢頻率是 24 小時,則您的同步操作每天可能會在大約一小時的時間窗口內發生,而不是在確切地同一時間發生。 要指定您自己的 Flex 間隔進行同步操作,您應開始使用新的 requestSync() 方法。如需了解更多詳情,請參閱下面的同步適配器部分。 這個 Flex 間隔行為僅適用于更新后的應用。如果您已將 targetSdkVersion 設置為“18”或更低版本,那么在 Android 4.4 上運行時,您的現有同步請求的行為方式和在以前版本上一樣。 #### **打印框架** 現在,Android 包含一個完整框架,允許用戶使用通過 WLAN、藍牙或其他服務連接的打印機打印任何文檔。系統在需要打印文檔的應用和向打印機傳輸打印作業的服務之間處理此事務。android.print 框架提供指定打印文檔并將其傳輸到系統進行打印所需要的所有 API。對于給定的打印作業,您實際需要哪個 API 取決于您的內容。 **打印通用內容** 如果您要從 UI 將內容打印為文檔,首先,您需要創建一個 PrintDocumentAdapter 的子類。在此類中,您必須實現幾個回調方法,包括 onLayout() 和 onWrite(),前者是為了基于提供的打印屬性建立布局,后者是為了將可打印內容序列化為一個 ParcelFileDescriptor。 為了將您的內容寫入 ParcelFileDescriptor,您必須向其傳遞一個 PDF。新的 PdfDocument API 簡化了此操作,它提供來自 getCanvas() 的 Canvas,您可以在上面繪制可打印內容。然后,使用 writeTo() 方法將 PdfDocument 寫入 ParcelFileDescriptor。 在針對 PrintDocumentAdapter 定義您的實現后,您可以根據用戶請求使用 PrintManager 方法 print() 執行打印作業,該方法將 PrintDocumentAdapter 作為它的一個參數。 **打印圖像** 如果您只想打印照片或其他位圖,則支持庫中的幫助程序 API 可以為您完成所有工作。只需創建一個新的 PrintHelper 實例,使用 setScaleMode() 設置縮放模式,然后將您的 Bitmap 傳遞到 printBitmap()。就這么簡單。支持庫將處理與系統進行的所有剩余交互,以將位圖傳輸到打印機。 **構建打印服務** 作為打印機原始設備制造商,您可以通過 Android 設備使用 android.printservice 框架為您的打印機提供互操作性,您可以以 APK 形式構建和分配打印服務,用戶可以將其安裝在他們的設備上。打印服務應用主要作為無外設服務運行,為 PrintService 類創建子類,后者從系統接收打印作業,并使用適當的協議將作業傳輸到它的打印機。 如需有關如何打印您的應用內容的詳細信息,請閱讀打印內容。 #### **短信提供程序** Telephony 內容提供程序(“短信提供程序”)允許應用讀寫設備上的短信和彩信。它包含已進行接收、起草、發送、掛起等操作的短信和彩信的表格。 從 Android 4.4 開始,系統設置允許用戶選擇一個“默認短信應用”。選擇后,只有默認短信應用可以在短信提供程序中進行寫入操作,并且當用戶接收短信或彩信時,只有默認短信應用可以接收 SMS_DELIVER_ACTION 廣播或 WAP_PUSH_DELIVER_ACTION 廣播。默認短信應用有責任在收到或發送新消息時將消息的詳細信息寫入短信提供程序。 其他未被選為默認短信應用的應用只能讀取短信提供程序,但通過偵聽 SMS_RECEIVED_ACTION 廣播,這些應用也許會在設備接收短信時收到通知,因為該廣播是不可中止的,所以可能會發送給多個應用。此廣播主要用于那些沒有被選為默認短信應用、但需要讀取特殊傳入消息(例如進行手機號碼驗證)的應用。 如需了解詳細信息,請閱讀博文讓您的短信應用為迎接 KitKat 做好準備。 #### **無線和連接** **主機卡模擬** Android 應用現在可以模擬使用 APDU 進行數據交換的 ISO14443-4 (ISO-DEP) NFC 卡(根據在 ISO7816-4 中進行的指定)。這讓運行 Android 4.4 并啟用 NFC 的設備可以同時模擬多個 NFC 卡,并允許 NFC 支付終端或其他 NFC 讀取器基于應用標識符 (AID) 通過適當的 NFC 卡發起交易。 如果您要在應用中模擬使用這些協議的 NFC 卡,則可基于 HostApduService 類創建一個服務組件。然而,如果您的應用改用一個安全的元素進行卡模擬,那么您必須基于 OffHostApduService 類創建一個服務,該服務不會直接參與交易,但必須通過它才能注冊應由安全元素處理的 AID。 如需了解詳細信息,請閱讀 NFC 卡模擬指南。 **NFC 讀取器模式** 新的 NFC 讀取器模式允許 Activity 將所有 NFC Activity 限制為在前臺時僅讀取 Activity 感興趣的標記類型。您可以使用 enableReaderMode() 為您的 Activity 啟用讀取器模式,提供一個 NfcAdapter.ReaderCallback 的實現,用于在檢測到新的標記時接收回調。 這個新功能與主機卡模擬結合使用,將允許 Android 同時在移動支付接口的兩端運行:一個設備作為支付終端運行(運行讀取器模式 Activity 的設備),另一個設備作為支付客戶端運行(模擬 NFC 卡的設備)。 **紅外線發射器** 現在,在附帶紅外線 (IR) 發射器的設備上運行時,您可以使用 ConsumerIrManager API 發射紅外線信號。要獲取 ConsumerIrManager 的實例,請使用 CONSUMER_IR_SERVICE 調用 getSystemService() 作為參數。然后,您可以使用 getCarrierFrequencies() 查詢設備支持的紅外線頻率,并通過使用 transmit() 傳遞所需的頻率和信號模式來發射信號。 首先,您必須通過調用 hasIrEmitter() 檢查設備是否附帶紅外線發射器,但是,如果您的應用僅與附帶紅外線發射器的設備兼容,則應在您的 "android.hardware.consumerir" (FEATURE_CONSUMER_IR) 的清單中包含一個 <uses-feature> 元素。 #### **多媒體** **自適應播放** 現在,可通過 MediaCodec API 支持自適應視頻播放,從而實現在 Surface 上播放時分辨率可無縫變更 - 您可以饋送新分辨率的解碼器輸入幀,輸出緩沖區的分辨率將發生變化,但不會出現大間隙。 您可以通過向 MediaFormat 添加兩個密鑰用于從編解碼器指定您的應用所需的最大分辨率(KEY_MAX_WIDTH 和 KEY_MAX_HEIGHT),來啟用自適應播放。將上述密鑰添加到您的 MediaFormat 后,使用 configure() 將 MediaFormat 傳遞到您的 MediaCodec 實例。 編解碼器將以無縫方式在等于或小于這些值的分辨率之間進行轉換。編解碼器可能還支持大于指定最大值的分辨率(只要在受支持配置文件的限制內),但可能無法以無縫方式轉換到較大分辨率。 要在解碼 H.264 視頻時更改分辨率,請繼續使用 MediaCodec.queueInputBuffer() 為幀排隊,但請確保在一個緩沖區中通過即時解碼刷新 (IDR) 幀同時提供新的序列參數集 (SPS) 和圖像參數集 (PPS) 值。 不過,在嘗試配置編解碼器進行自適應播放之前,您必須先使用 FEATURE_AdaptivePlayback 調用 isFeatureSupported(String) 來驗證設備是否支持自適應播放。 > 注:是否支持自適應播放因供應商而異。某些編解碼器可能需要更多內存來實現較大的分辨率 hint。因此,您應基于您正在解碼的源材料設置分辨率最大值。 **音頻點播時間戳** 為促進音頻視頻同步,新的 AudioTimestamp 類在一個由 AudioTrack 處理的音頻流中提供有關特定“幀”的時間線詳細信息。要獲取最新可用的時間戳,請實例化 AudioTimestamp 對象并將其傳遞到 getTimestamp()。如果請求時間戳成功,將使用幀單元中的某個位置以及顯示或承諾顯示該幀的預估時間填充 AudioTrack 實例。 您可以在 AudioTimestamp(其屬于單調遞增)中使用 nanoTime 的值查找與 framePosition 相比關聯最密切的視頻幀,這樣可以拖放、復制或內插視頻幀以便與音頻匹配。或者,您可以確定 nanoTime 的值和未來視頻幀的預計時間之間的增量時間(考慮樣本率),以預測哪個音頻幀有望與視頻幀同時發生。 **Surface 圖像讀取器** 新的 ImageReader API 讓您可以直接訪問圖像緩沖區,因為它們渲染為 Surface。您可以通過靜態方法 newInstance() 獲取 ImageReader。然后,調用 getSurface() 新建一個 Surface,并使用 MediaPlayer 或 MediaCodec 等制作器傳輸您的圖像數據。要在可通過 Surface 獲取新圖像時收到通知,請實現 ImageReader.OnImageAvailableListener 接口,并使用 setOnImageAvailableListener() 注冊它。 現在,由于您將內容繪制到 Surface,因此,當每個新圖像幀可用時,您的 ImageReader.OnImageAvailableListener 將收到對 onImageAvailable() 的調用,為您提供相應的 ImageReader。通過調用 acquireLatestImage() 或 acquireNextImage(),您可以使用 ImageReader 獲取幀的圖像數據作為 Image 對象。 通過 Image 對象,您可以直接訪問 ByteBuffer 中的圖像的時間戳、格式、尺寸和像素數據。不過,要讓 Image 類解釋您的圖像,則必須按照 ImageFormat 或 PixelFormat 中的常量定義的某個類型對其進行格式化。 **峰值和有效值 (RMS) 測量** 現在,通過創建 Visualizer.MeasurementPeakRms 的新實例,并將其傳遞到 getMeasurementPeakRms(),您可以從 Visualizer 查詢當前音頻流的峰值和有效值 (RMS)。當您調用此方法時,給定 Visualizer.MeasurementPeakRms 的峰值和有效值 (RMS) 將設為最新的測量值。 **音量增強器** LoudnessEnhancer 是 AudioEffect 的一個新子類,允許您增加 MediaPlayer 或 AudioTrack 的音量。此方法特別適合與上面提到的新的 getMeasurementPeakRms() 方法結合使用,以便在播放其他媒體的同時增加語音音軌的音量。 **遙控器** Android 4.0(API 級別 14)引入了 RemoteControlClient API,其允許媒體應用從遠程客戶端使用媒體控制器事件,例如鎖定屏幕上的媒體控件。現在,新的 RemoteController API 允許您構建自己的遙控器,使您能夠開發創新的應用和外圍設備,來控制與 RemoteControlClient 集成的任何媒體應用的播放。 要生成遙控器,您可隨意實現您的用戶界面,但要向用戶的媒體應用傳輸媒體按鈕事件,就必須創建一個服務來擴展 NotificationListenerService 類和實現 RemoteController.OnClientUpdateListener 接口。將 NotificationListenerService 作為基礎非常重要,因為它可提供適當的隱私限制,其要求用戶在系統安全性設置中啟用您的應用作為通知偵聽器。 NotificationListenerService 類包含一對您必須實現的抽象方法,但如果您僅關心用于處理媒體播放的媒體控制器事件,那么您可以為其設置空實現,并將重點轉向 RemoteController.OnClientUpdateListener 方法。 **從遙控器進行評分** Android 4.4 基于遙控客戶端(使用 RemoteControlClient 接收媒體控件事件的應用)的現有功能創建,添加了允許用戶從遙控器對當前曲目進行評分的功能。 新的 Rating 類封裝與用戶評分有關的信息。評分由其評分樣式(RATING_HEART、RATING_THUMB_UP_DOWN、RATING_3_STARS、RATING_4_STARS、RATING_5_STARS 或 RATING_PERCENTAGE)和適用于該樣式的評分值定義。 要允許用戶從遙控器對您的曲目進行評分: * 通過在 setTransportControlFlags() 中添加 FLAG_KEY_MEDIA_RATING 標記指示系統您想要向用戶公開評分 UI(如果適用)。 * 調用 editMetadata() 以檢索 RemoteControlClient.MetadataEditor,并使用 addEditableKey() 向其傳遞 RATING_KEY_BY_USER。 * 然后,指定評分樣式,方法是調用 putObject() 并向其傳遞 RATING_KEY_BY_USER 作為密鑰,同時向其傳遞上述某個評分樣式作為值。 要在用戶從遙控器更改評分時接收回調,則實現新的 RemoteControlClient.OnMetadataUpdateListener 接口,并向 setMetadataUpdateListener() 傳遞一個實例。當用戶更改評分時,您的 RemoteControlClient.OnMetadataUpdateListener 將收到一個對 onMetadataUpdate() 的調用,傳遞 RATING_KEY_BY_USER 作為密鑰,同時傳遞一個 Rating 對象作為值。 **隱藏式字幕** 現在,播放 HTTP Live Stream (HLS) 視頻時,VideoView 支持 WebVTT 字幕跟蹤,根據用戶在系統設置中定義的隱藏式字幕首選項顯示字幕跟蹤。 您也可以使用 addSubtitleSource() 方法為 VideoView 提供 WebVTT 字幕跟蹤。此方法接受一個 InputStream,其攜帶字幕數據和指定該字幕數據格式的 MediaFormat 對象,您可以使用 createSubtitleFormat() 指定該對象。這些字幕也會按照用戶的首選項顯示在視頻上。 如果您不使用 VideoView 顯示您的視頻內容,則應盡可能使您的字幕疊加層與用戶的隱藏式字幕首選項匹配。新的 CaptioningManager API 允許您查詢用戶的隱藏式字幕首選項,包括 CaptioningManager.CaptionStyle 定義的樣式,如字體和顏色。如果用戶在視頻已開始后調整部分首選項,您應偵聽首選項的變化,方法是注冊一個 CaptioningManager.CaptioningChangeListener 實例以在任意首選項發生變化時接收回調,然后根據需要更新您的字幕。 #### **動畫和圖形** **場景和轉場** 新的 android.transition 框架提供有諸多 API,可為在不同用戶界面狀態之間創建動畫提供便利。一個關鍵的功能是讓您能夠通過為每個狀態創建單獨的布局,定義不同的 UI 狀態,稱為“場景”。當您需要制作從一個場景到另一個場景的動畫時,可執行“轉場”,其計算更改從當前場景到下一場景的布局所需的動畫。 要在兩個場景間進行轉場,您通常需要執行以下操作: 1. 指定包含您要更改的 UI 組件的 ViewGroup。 2. 指定表示變更的最終結果的布局(下一個場景)。 3. 指定應添加布局變更動畫的轉場類型。 4. 執行轉場。 您可以使用 Scene 對象完成第 1 步和第 2 步。Scene 包含描述執行轉場所必需的布局屬性的元數據,其中包括場景的父視圖和場景布局。您可以使用類構造函數或靜態方法 getSceneForLayout() 創建 Scene。 然后,您必須使用 TransitionManager 完成第 3 步和第 4 步。其中一個方法是將您的 Scene 傳遞到靜態方法 go()。這樣可在當前布局中找到場景的父視圖,并在子視圖上執行轉場,以實現 Scene 定義的布局。 或者,您根本不需要創建 Scene 對象,而是改為調用 beginDelayedTransition(),指定一個包含您要更改的視圖的 ViewGroup。然后,添加、移除或重新配置目標視圖。在系統根據需要進行更改后,轉場開始以動畫方式呈現所有受影響的視圖。 要進行其他控制,您可以使用項目 res/transition/ 目錄中的 XML 文件定義應在預定義的場景間發生的轉場集。在 `<transitionManager>` 元素內部,指定一個或多個 `<transition>` 標記,每個標記均指定一個場景(引用布局文件)以及進入和/或退出該場景時將應用的轉場。然后,使用 inflateTransitionManager() 擴展此轉場集。使用返回的 TransitionManager 通過 transitionTo() 執行每個轉場,傳遞一個由 `<transition>` 標記表示的 Scene。您還可以使用 TransitionManager API 以編程方式定義轉場集。 指定轉場時,您可以使用 Transition 的子類(如 Fade 和 ChangeBounds)定義的多個預定義類型。如果您不指定轉場類型,系統會默認使用 AutoTransition,其根據需要自動消失、移動和重新調整視圖。此外,您也可以通過擴展其中的任何一個類來創建自定義轉場,以執行您需要的動畫。自定義轉場可以跟蹤您想要跟蹤的任何屬性變更,并基于這些變更創建您需要的任何動畫。例如,您可以提供 Transition 的子類,用于偵聽對視圖的“旋轉”屬性進行的變更,然后以動畫方式呈現所有變更。 如需了解詳細信息,請參閱 TransitionManager 文檔。 **動畫暫停** Animator API 現在允許您使用方法 pause() 和 resume() 暫停和繼續進行中的動畫。 要跟蹤動畫的狀態,您可以實現 Animator.AnimatorPauseListener 接口,其在暫停和繼續動畫時提供回調:pause() 和 resume()。然后使用 addPauseListener() 向 Animator 對象添加偵聽器。 或者,您可以創建 AnimatorListenerAdapter 抽象類的子類,其現在包含針對 Animator.AnimatorPauseListener 定義的暫停和繼續回調的空實現。 **可重復使用的位圖** 現在,您可以重復使用 BitmapFactory 中的任意可變位圖來解碼任何其他位圖,即使新位圖具有不同的尺寸也無妨,只要生成的已解碼位圖的字節計數(可通過 getByteCount() 獲取)小于或等于分配的已重用位圖的字節計數(可通過 getAllocationByteCount() 獲取)即可。如需了解詳細信息,請參閱 inBitmap。 適用于 Bitmap 的新 API 允許針對 BitmapFactory 外部的重復使用進行相似的重新配置(適用于手動位圖生成或自定義解碼邏輯)。現在,您可以使用方法 setHeight() 和 setWidth() 設置位圖的尺寸,并使用 setConfig() 指定一個新的 Bitmap.Config,而不會影響底層位圖分配。此外,利用 reconfigure() 方法可方便地將這些變更合并到一個調用。 不過,您不應重新配置視圖系統當前使用的位圖,因為底層像素緩沖區重新映射的方式不可預測。 #### **用戶內容** **存儲訪問框架** 在以前的 Android 版本上,如果您想讓應用從其他應用中檢索特定的文件類型,它必須調用具有ACTION_GET_CONTENT 操作的 intent。此操作仍適合請求您要導入到應用中的文件。不過,Android 4.4 引入了 ACTION_OPEN_DOCUMENT 操作,其允許用戶選擇特定類型的文件并授予應用對該文件的長期讀取權限(可能也授予寫入權限),無需向您的應用導入此文件。 如果您要開發為文件提供存儲服務(如云保存服務)的應用,可以加入這個統一的 UI,通過實現一個內容提供程序作為新 DocumentsProvider 類的子類來選取文件。您的 DocumentsProvider 的子類必須包含一接受 PROVIDER_INTERFACE 操作 ("android.content.action.DOCUMENTS_PROVIDER") 的 intent 過濾器。然后,您必須在 DocumentsProvider 中實現四個抽象方法: * queryRoots() 此方法必須使用 DocumentsContract.Root 中定義的列返回一個描述文檔存儲空間的所有根目錄的 Cursor。 * queryChildDocuments() 此方法必須使用 DocumentsContract.Document 中定義的列返回一個描述指定目錄中的所有文件的 Cursor。 * queryDocument() 此方法必須使用 DocumentsContract.Document 中定義的列返回一個描述指定文件的 Cursor。 * openDocument() 此方法必須返回一個表示指定文件的 ParcelFileDescriptor。用戶選擇了文件,并且客戶端應用通過調用 openFileDescriptor() 請求對該文件的訪問權限后,系統便會調用此方法。 如需了解詳細信息,請參閱存儲訪問框架指南。 **外部存儲空間訪問** 現在,您可以在輔助外部存儲介質上讀取和寫入應用特定文件,如在設備提供模擬的存儲空間和 SD 卡時。新增的方法 getExternalFilesDirs() 與現有的 getExternalFilesDir() 方法作用相同,不過它會返回一個 File 對象數組。在讀取或寫入此方法返回的任意路徑之前,將 File 對象傳遞到新的 getStorageState() 方法以驗證存儲空間當前是否可用。 現在,用于訪問應用專有緩存目錄和 OBB 目錄的其他方法也具有對應的版本,這些版本可提供輔助存儲設備的訪問權限:分別為 getExternalCacheDirs() 和 getObbDirs()。 將返回的 File 數組中的第一個條目視為設備的主要外部存儲空間,其與 getExternalFilesDir() 等現有方法返回的 File 相同。 > 注:從 Android 4.4 開始,當您需要使用上述方法僅訪問您的應用特定外部存儲區域時,此平臺不再要求您的應用獲取 WRITE_EXTERNAL_STORAGE 或 READ_EXTERNAL_STORAGE。不過,如果您要訪問 getExternalStoragePublicDirectory() 提供的外部存儲空間的可共享區域,則需要這些權限。 **同步適配器** ContentResolver 中新的 requestSync() 方法將請求封裝在新的 SyncRequest 對象中(您可以使用 SyncRequest.Builder 創建該對象),從而簡化了為 ContentProvider 定義同步請求的一些步驟。SyncRequest 中的屬性提供與現有 ContentProvider 同步調用相同的功能,但增加了一項功能,即:可以通過啟用 setDisallowMetered() 指定當網絡按流量計費時應放棄同步。 #### **用戶輸入** **新傳感器類型** 新的 TYPE_GEOMAGNETIC_ROTATION_VECTOR 傳感器基于磁力計提供旋轉矢量數據,當陀螺儀不可用或與批處理傳感器事件結合用于在手機處于休眠狀態下記錄設備的屏幕方向時,它可以很好地代替 TYPE_ROTATION_VECTOR 傳感器。此傳感器耗電比 TYPE_ROTATION_VECTOR 更低,但可能容易出現噪音事件數據,因此當用戶在戶外時其效果最佳。 Android 現在也在硬件中支持內置計步傳感器: * TYPE_STEP_DETECTOR 用戶每邁出一步,此傳感器就會觸發一個事件。對于每個用戶步伐,此傳感器提供一個值為 1.0 的事件和一個指示此步伐發生時間的時間戳。 * TYPE_STEP_COUNTER 此傳感器也會針對檢測到的每個步伐觸發一個事件,但提供的步數是自應用首次注冊該傳感器以來累計的總步數。 請注意,這兩個計步傳感器提供的結果并非總是相同。與來自 TYPE_STEP_DETECTOR 的事件相比,TYPE_STEP_COUNTER 事件的發生延遲時間更長,但這是因為 TYPE_STEP_COUNTER 算法會進行較多的處理以消除誤報。因此,TYPE_STEP_COUNTER 在傳輸事件時可能較為緩慢,但其結果應更為準確。 這兩個計步傳感器都依賴硬件(Nexus 5 是首款支持它們的設備),因此您應使用 FEATURE_SENSOR_STEP_DETECTOR 和 FEATURE_SENSOR_STEP_COUNTER 常量檢查 hasSystemFeature() 的可用性。 **批處理傳感器事件** 為更好地管理設備電源,SensorManager API 現在允許您指定您想要系統向應用傳輸批量傳感器事件的頻率。這不會減少給定時間段內您的應用可用的實際傳感器事件數量,但是會降低系統使用傳感器更新調用 SensorEventListener 的頻率。也就是說,系統會將一段時間內發生的所有事件保存起來,然后一次性將它們傳輸到您的應用,而不是在每個事件發生時將其傳輸到您的應用。 為提供批處理,SensorManager 類添加了兩個新的 registerListener() 方法版本,其允許您指定“最大報告延遲時間”。這個新參數指定您的 SensorEventListener 對于傳輸新傳感器事件可容忍的最大延遲。例如,如果您指定一分鐘的批量延遲時間,則系統將通過連續調用 onSensorChanged() 方法(針對批處理的每個事件調用一次)以不超過一分鐘的間隔傳輸最新的批處理事件集。傳感器事件的延遲時間絕不會超過最大報告延遲時間值,但如果其他應用針對相同的傳感器請求了較短的延遲時間,則事件可能會較快到達。 不過,請注意,僅當 CPU 處于喚醒狀態時,此傳感器才會基于報告延遲時間向應用傳輸批處理事件。盡管在 CPU 處于休眠狀態時支持批處理的硬件傳感器將繼續收集傳感器事件,但它不會喚醒 CPU 向應用傳輸批處理事件。當傳感器最終耗盡了其用于存儲事件的內存時,它將開始丟棄最早的事件以保存最新的事件。您可以在傳感器填滿其內存之前喚醒設備來避免丟失事件,然后調用 flush() 來采集最新的批處理事件。要預估內存的填滿時間和刷新時間,請調用 getFifoMaxEventCount() 以獲取它可以保存的最大數量的傳感器事件,并用該數字除以您的應用需要各個事件的比率。使用該計算結果通過 AlarmManager 設置喚醒鬧鈴,其調用 Service(實現 SensorEventListener)來刷新傳感器。 > 注:并非所有設備都支持批處理傳感器事件,因為它需要硬件傳感器的支持。不過,從 Android 4.4 開始,您應始終使用新的 registerListener() 方法,因為如果設備不支持批處理,系統會相應地忽略批處理延遲時間參數,并實時傳輸傳感器事件。 **控制器身份** 現在,Android 使用一個唯一的整數識別每個已連接的控制器,您可以使用 getControllerNumber() 查詢該整數,這樣您可以更輕松地將每個控制器與游戲中的不同玩家進行關聯。每個控制器的編號可能會因用戶斷開、連接或重新配置控制器而發生變化,因此您應注冊一個 InputManager.InputDeviceListener 實例來跟蹤與每個輸入設備對應的控制器編號。然后,在發生變化時為每個 InputDevice 調用 getControllerNumber()。 現在,已連接的設備還提供產品和供應商 ID,這些 ID 可通過 getProductId() 和 getVendorId() 獲取。如果您需要基于設備上可用的密鑰集修改您的密鑰映射,您可以查詢該設備以檢查特定密鑰是否可以通過 hasKeys(int...) 獲取。 #### **用戶界面** **沉浸式全屏模式** 要為您的應用提供填充整個屏幕的布局,適用于 setSystemUiVisibility() 的新標記 SYSTEM_UI_FLAG_IMMERSIVE(與 SYSTEM_UI_FLAG_HIDE_NAVIGATION 結合使用時)將啟用新的沉浸式全屏模式。在啟用沉浸式全屏模式后,您的 Activity 將繼續接收所有觸摸事件。用戶可以沿著系統狀態欄正常出現的區域向內滑動來顯示系統狀態欄。這將清除 SYSTEM_UI_FLAG_HIDE_NAVIGATION 標記(如果應用了 SYSTEM_UI_FLAG_FULLSCREEN 標記,也會清除該標記),因此系統狀態欄保持可見狀態。但是,如果您想要系統狀態欄在片刻后再次隱藏,可以改用 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 標記。 **透明系統狀態欄** 現在,您可以使用新主題背景 Theme.Holo.NoActionBar.TranslucentDecor 和 Theme.Holo.Light.NoActionBar.TranslucentDecor 將系統狀態欄設置為部分透明。通過啟用透明系統狀態欄,您的布局將填充系統狀態欄后面的區域,因此,您也必須為不應被系統狀態欄覆蓋的布局部分啟用 fitsSystemWindows。 如果您要創建自定義主題背景,則將其中某個主題背景設置為父主題背景,或在您的主題背景中添加 windowTranslucentNavigation 和 windowTranslucentStatus 樣式屬性。 **增強的通知偵聽器** Android 4.3 添加了 NotificationListenerService API,從而允許應用在系統發布新通知后接收有關新通知的信息。在 Android 4.4 中,通知偵聽器可以檢索通知的附加元數據,并填寫有關通知操作的詳細信息: 新增的 Notification.extras 字段包含一個 Bundle,以向您的通知生成器提供 EXTRA_TITLE 和 EXTRA_PICTURE 等附加元數據。新增的 Notification.Action 類定義附加到通知的操作的特性,您可以從新的 actions 字段中檢索這些特性。 **可繪制的 RTL 布局鏡像** 在以前的 Android 版本中,如果您的應用包含應針對從右向左布局扭轉其水平方向的圖像,那么您必須在 drawables-ldrtl/ 資源目錄中添加鏡像。現在,通過在可繪制資源上啟用 autoMirrored 屬性,或通過調用 setAutoMirrored(),系統可以自動為您進行鏡像。啟用后,當布局方向為從右到左時,Drawable 將自動鏡像。 **無障礙功能** 現在,借助 View 類,可以通過向您的 XML 布局添加新的 accessibilityLiveRegion 屬性或調用 setAccessibilityLiveRegion(),為使用新增文本內容動態更新的 UI 部分聲明“實時區域”。例如,應將帶有顯示“密碼錯誤”通知的文本字段的登錄屏幕標記為一個實時區域,以便當它發生變化時,屏幕閱讀器可以復述此消息。 現在,提供無障礙服務的應用還可以利用新 API 增強其能力,這些 API 通過 AccessibilityNodeInfo.CollectionInfo 和 AccessibilityNodeInfo.CollectionItemInfo 提供與列表或網格視圖等視圖集有關的信息。 #### **應用權限** 您的應用必須使用 <uses-permission> 標記請求下面的新權限才能使用某些新 API: * INSTALL_SHORTCUT 允許應用在啟動器中安裝快捷鍵 * UNINSTALL_SHORTCUT 允許應用在啟動器中卸載快捷鍵 * TRANSMIT_IR 允許應用使用設備的紅外線發射器(如果可用) > 注:從 Android 4.4 開始,當您想要使用 getExternalFilesDir() 等方法訪問外部存儲空間上應用特有區域時,此平臺不再要求您的應用獲取 WRITE_EXTERNAL_STORAGE 或 READ_EXTERNAL_STORAGE。但是,如果您要訪問 getExternalStoragePublicDirectory() 提供的外部存儲空間上可共享的區域,則仍需要此權限。 #### **設備功能** 下面是您可以使用 <uses-feature> 標記聲明的新設備功能,以聲明您的應用要求,并在 Google Play 上啟用過濾功能或在運行時進行檢查: * FEATURE_CONSUMER_IR 此設備可與消費者紅外線設備進行通信。 * FEATURE_DEVICE_ADMIN 此設備通過設備管理員支持設備規范執行。 * FEATURE_NFC_HOST_CARD_EMULATION 此設備支持基于主機的 NFC 卡模擬。 * FEATURE_SENSOR_STEP_COUNTER 此設備附帶硬件計步器。 * FEATURE_SENSOR_STEP_DETECTOR 此設備附帶硬件步測器。 如需詳細了解 Android 4.4 中的所有 API 變更,請參閱 API 差異報告。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看