MediaProjectionManager.createScreenCaptureIntent()
AndroidManifest.xml
<application
...
android:allowAudioPlaybackCapture="false"/>
AudioManager.setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
AudioAttributes.Builder.setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
AudioManager.setAllowedCapturePolicy(ALLOW_CAPTURE_BY_NONE)
AudioAttributes.Builder.setAllowedCapturePolicy(ALLOW_CAPTURE_BY_NONE)
manifest.xml
android:allowAudioPlaybackCapture="true"
scope.launch { // このブロックは、スコープ「内」で // 新規コルーチンを開始します。 // // コルーチンは中断関数を呼び出すことができます。 fetchDocs() }
class MyViewModel(): ViewModel() { fun userNeedsDocs() { // ViewModel 内で新しいコルーチンを開始 viewModelScope.launch { fetchDocs() } } }
fun runForever() { // ViewModel 内で新しいコルーチンを開始 viewModelScope.launch { // ViewModel がクリアされるとキャンセルされる while(true) { delay(1_000) // 毎秒、なんらかの処理を実行 } } }
suspend fun fetchTwoDocs() { coroutineScope { launch { fetchDoc(1) } async { fetchDoc(2) } } }
val unrelatedScope = MainScope() // エラーが失われる例 suspend fun lostError() { // 構造化された並行性を持たない async unrelatedScope.async { throw InAsyncNoOneCanHearYou("except") } }
suspend fun foundError() { coroutineScope { async { throw StructuredConcurrencyWill("throw") } } }
オンデマンド モジュールを使う場合は、必ず Play Core Library の SplitCompat を使うようにしてください。
R8 最適化が行われていることを確認するには、Android Studio の APK Analyzer 内にある DEX Viewer を使い、ベース DEX ファイルから ServiceLoader クラスの参照を検索します。R8 が正常に働いている場合、何も見つかりません。
ServiceLoader.load() の呼び出しが表示されている場合(上のアニメーション)、最適化が動作していないため、呼び出しスレッドでディスク I/O オペレーションが発生し、アプリがフリーズする可能性があります。そのため、ServiceLoader パターンを使う場合は、必ず最適化が有効になっていることを確認してください。
どのアプローチを使う場合でも、アプリに DFM APK をインストールした後、StorageFeature オブジェクト グラフのみをインスタンス化する必要があります。
DFM が条件付きまたはオンデマンドで配信される場合は、最初に SplitInstallManager.installedModules を使って確認するようにしてください。
class ViewModel: ViewModel() { fun fetchDocs() { get("developer.android.com") { result -> show(result) } } }
// Dispatchers.Main suspend fun fetchDocs() { // Dispatchers.IO val result = get("developer.android.com") // Dispatchers.Main show(result) } // 次のセクションで以下を参照 suspend fun get(url: String) = withContext(Dispatchers.IO){/*...*/}
// Dispatchers.Main suspend fun fetchDocs() { // Dispatchers.Main val result = get("developer.android.com") // Dispatchers.Main show(result) } // Dispatchers.Main suspend fun get(url: String) = // Dispatchers.IO withContext(Dispatchers.IO) { // Dispatchers.IO /* ブロッキング処理を実行 */ } // Dispatchers.Main
final BitmapFactory.Options options = new BitmapFactory.Options(); // Decode this file to sRGB color space. options.inPreferredColorSpace = ColorSpace.get(Named.SRGB); Bitmap bitmap = BitmapFactory.decodeFile(FILE_PATH, options);
ImageDecoder.Source source = ImageDecoder.createSource(FILE_PATH); try { bitmap = ImageDecoder.decodeBitmap(source, new ImageDecoder.OnHeaderDecodedListener() { @Override public void onHeaderDecoded(ImageDecoder decoder, ImageDecoder.ImageInfo info, ImageDecoder.Source source) { decoder.setTargetColorSpace(ColorSpace.get(Named.SRGB)); } }); } catch (IOException e) { // handle exception. }
ImageDecoder.Source source = ImageDecoder.createSource(FILE_PATH); try { bitmap = ImageDecoder.decodeBitmap(source, new ImageDecoder.OnHeaderDecodedListener() { @Override public void onHeaderDecoded(ImageDecoder decoder, ImageDecoder.ImageInfo info, ImageDecoder.Source source) { ColorSpace cs = info.getColorSpace(); // Do something... } }); } catch (IOException e) { // handle exception. }
// This is bad, don't do it! final BitmapFactory.Options options = new BitmapFactory.Options(); final Bitmap bitmap = BitmapFactory.decodeFile(FILE_PATH, options); glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES31.GL_RGBA, bitmap.getWidth(), bitmap.getHeight(), 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, bitmap, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE);
wideColorGamut
android:colorMode="wideColorGamut"
private static final int EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT = 0x3490; public EGLSurface createWindowSurface(EGL10 egl, EGLDisplay display, EGLConfig config, Object nativeWindow) { EGLSurface surface = null; try { int attribs[] = { EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT, egl.EGL_NONE }; surface = egl.eglCreateWindowSurface(display, config, nativeWindow, attribs); } catch (IllegalArgumentException e) {} return surface; }
registerOnPageChangeCallback