20220108のAndroidに関する記事は4件です。

アクティビティライフサイクルの大まかな流れを把握する

この記事は Android 公式 Doc のアクティビティライフサイクル に、図など視覚情報を補足したもの。 内容はあくまで参考にとどめてください 以下のサンプルアプリ(仮称: Lifecycle アプリ) を使う。 Lifecycle アプリには MainActivity, SettingActivity が存在する Lifecycle アプリ初回起動時は MainActivity が起動する SettingActivity は MainActivity から startActivity で起動する finish() で終了する MainActivity SettingActivity 実行操作とライフサイクル順序 今回取り上げる実行操作は以下。 (1) アプリを開始する (2) アクティビティから別アクティビティを開始する (3) タスクボタンからアプリ一覧を表示する (4) アプリ一覧表示から戻る (5) アプリ一覧から、アプリを終了させる (6) 特定アクティビティを終了する (7) ホーム画面へ戻る (8) ホーム画面からアプリを再実行する (1) アプリを開始する Lifecycle アプリは未起動とする Lifecycle アイコンをタップすると、MainActivity が起動する ライフサイクル順序(上から順に実行される) MainActivity onCreate onStart onResume BEFORE AFTER (2) アクティビティから別アクティビティを開始する MainActivity から SettingActivity を startActivity で起動する ライフサイクル順序(上から順に実行される) MainActivity onPause SettingActivity onCreate onStart onResume MainActivity onStop BEFORE AFTER (3) タスクボタンからアプリ一覧を表示する SettingActivity を表示しておく ナビゲーションバー右下のタスクボタンをタップする ライフサイクル順序(上から順に実行される) SettingActivity onPause onStop BEFORE AFTER (4) アプリ一覧表示から戻る アプリ一覧表示の状態 (3) から、アプリをタップし戻る ライフサイクル順序(上から順に実行される) SettingActivity onRestart onStart onResume BEFORE AFTER (5) アプリ一覧から、アプリを終了させる アプリ一覧表示の状態 (3) から、アプリをフリップする アプリ一覧に Lifecycle アプリが出ないようにする ライフサイクル順序(上から順に実行される) SettingActivity onDestroy MainActivity onDestroy BEFORE AFTER (6) 特定アクティビティを終了する SettingActivity が表示されている状態にする SettingActivity にて finish() する MainActivity が表示される ライフサイクル順序(上から順に実行される) SettingActivity onPause MainActivity onRestart onStart onResume SettingActivity onStop onDestroy BEFORE AFTER (7) ホーム画面へ戻る MainActivity が表示されている状態にする ホームボタンをタップする ライフサイクル順序(上から順に実行される) MainActivity onPause onStop BEFORE AFTER (8) ホーム画面からアプリを再実行する (7) の通りホーム画面へ戻る Lifecycle アプリのアイコンをタップする ライフサイクル順序(上から順に実行される) MainActivity onRestart onStart onResume BEFORE AFTER 捕捉 クラッシュ・ANR などを考慮すると網羅はできていないが、ここまでにしておく。 本当にそうなるかは手元で同様のサンプルアプリを作り、ログを追いながら確認お願いしたい。 環境情報 Android Studio 2020.3.1 gradle 7.0.3 JDK 1.8 Windows 11(21H2) Android SDK compile, target, min 共に 28
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Expo (React Native) でViewを画像に変換してデバイスに保存する

はじめに React Nativeで新作アプリを作りました。 久しぶりにカスみたいなアプリ作りました姓名判断っぽい画像を捏造できます12/30に完成したんですが、Appleさんに怪しい占いアプリと勘違いされ、なかなか出せませんでした#嘘姓名判断iOShttps://t.co/2gUSUI2rQCAndroidhttps://t.co/IyslOklSkl pic.twitter.com/kG0NxRcMkW— yoshii? (@ganja_tuber) January 5, 2022 嘘の姓名判断の結果を捏造できるおふざけアプリです。 好きなように運勢を選択して… こんな感じの適当な姓名判断を作れます よかったら遊んでみてください。 困ったこと React NativeでViewを画像に変換し、デバイスに保存するのに手間取ったので、 実装方法を書きます。 (Androidは実機を持っていないので、動かなかったらコメントとかで教えてください。一応シミュレーションでは動作確認してます。) GitHub リポジトリ 解説するコードは全て以下のリポジトリにまとめてます。 実装方法 前提 Expo CLIを入れておいてください 生のReact Native派の人は適宜読み替えてください あと、yarn使います。npmの人も適宜読み替えてください。 プロジェクト作成 まずは、expo init ターミナルに以下を入力 expo init ExpoConvertImageSample ExpoConvertImageSampleのとこは適当に決めてください。 エンター押したらなんか聞かれるので、blank (TypeScript) を選びます。 TypeScriptじゃなかったり、react navigationしたい人は適宜変えてね。 実装 ライブラリ導入 yarn add react-native-view-shot expo-media-library react-native-view-shot: Viewを画像に変換します expo-media-library: カメラロールに画像を保存します 以下コードです。 App.tsx import React, { useCallback, useRef, VFC } from "react"; import { View, Text, Button, Platform, Alert } from "react-native"; import ViewShot, { captureRef } from "react-native-view-shot"; import * as MediaLibrary from "expo-media-library"; const os = Platform.OS; const App: VFC = () => { const viewShot = useRef(null); const permissionAlert = () => { Alert.alert( "画像の保存が許可されませんでした。", "設定から画像の保存を許可してください。" ); }; const saveImageFromView = async () => { try { const uri = await captureRef(viewShot); await MediaLibrary.saveToLibraryAsync(uri); Alert.alert("画像の保存完了"); } catch (e) { console.log(e); permissionAlert(); } }; const capture = useCallback(async () => { // android if (os === "android") { const permission = await MediaLibrary.getPermissionsAsync(); if (permission.canAskAgain && permission.status !== "granted") { const permissionResponse = await MediaLibrary.requestPermissionsAsync(); if (permissionResponse.status !== "granted") { permissionAlert(); } else { await saveImageFromView(); } } else if (permission.status !== "granted") { permissionAlert(); } else { await saveImageFromView(); } } // iOS else { await saveImageFromView(); } }, []); return ( <View> <ViewShot ref={viewShot} style={{ height: 500, width: 300, backgroundColor: "red" }} > <Text style={{ fontSize: 30, marginTop: 200, textAlign: "center" }}> {"こんにちは〜"} </Text> </ViewShot> <Button title="変換して保存する" onPress={capture} /> </View> ); }; export default App; 上記のコードをApp.tsxにコピペして、 yarn start して、シミュレーター起動してボタンを押したらカメラロールに画像が保存されるはずです。 解説 やっていることの根幹は、saveImageFromView関数内の以下の2行です。 1行目でref属性にviewShotを指定しているViewをキャプチャーして、uriを取得。 2行目でそのuriから画像を保存してます。 App.tsx const uri = await captureRef(viewShot); await MediaLibrary.saveToLibraryAsync(uri); 現在(2022/01/08)、iOSだとカメラロールに保存する処理が走ると初回には勝手に保存を許可するかユーザに尋ねるAlertが出てくれるので、ぶっちゃけこの2行だけでいいです。 iOSで許可を求める様子 ただ、Androidだと少し話が変わってきます。 以下の1行でしっかり許可を要求する必要があります。 App.tsx const permissionResponse = await MediaLibrary.requestPermissionsAsync(); androidで許可を求める様子 また、保存の許可を求めるAlertは何回も出しちゃいけないことになってるので、2回目以降は permissionAlert 関数を使って設定から許可し直すことを要求するという形にしてます。 注意 開発環境でExpo Goを使って動作確認をしているときに、1回目の保存の許可を求めるAlertを拒否した場合、設定から再度許可しても保存できないようです。 1回目のAlertで保存を拒否した後の動作確認がしたい人は yarn buildして、静的ファイルを生成して確認するのが確実で良いでしょう。 まとめ React NativeでViewを画像に変換して保存する方法を書きました。 これを使えば作れるアプリの幅が広がると思います。 わからないことや、問題があればコメントお願いします。 では、さようなら〜
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VibratorManager を利用する

Context.VIBRATOR が Deprecated に API Level 31 (Android 12) より getSystemService(Context.VIBRATOR) が Deprecated になりました。 以降は同じく API Level 31 で追加された getSystemService(Context.VIBRATOR_MANAGER_SERVICE) の使用が推奨されます。 Vibrator Manager の使い方 AndroidManifest.xml に次のパーミッションを追加します。 AndroidManifest.xml <uses-permission android:name="android.permission.VIBRATE"/> つづいて MainActivity.kt に処理を記述します。 サンプルではこまかな点まで考慮しておりませんのでご了承ください。 MainActivity.kt class MainActivity : AppCompatActivity() { @RequiresApi(Build.VERSION_CODES.S) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val vibratorManager = getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager val vibrationEffect = VibrationEffect.createWaveform( longArrayOf(500L, 500L), intArrayOf(VibrationEffect.DEFAULT_AMPLITUDE, 0), 3 ) val combinedVibration = CombinedVibration.createParallel(vibrationEffect) findViewById<Button>(R.id.Button).setOnClickListener { vibratorManager.vibrate(combinedVibration) } } } 従来の Vibrator を使用する方法との違いは、CombinedVibration が加えられる点です。 公式リファレンス によると CombinedVibration は API Level 31 で追加された振動機能全般を管理するためのクラスとなっています。 従来の振動機能に加え、触覚フィードバックも一元化して扱いやすくするのが狙いなようです。 その点を除くと、 VibrationEffect オブジェクトを生成し VibratorManager.vibrate() に渡すという基本サイクルは変わりません。 実行中のvibratorをすべて停止するには、 VibratorManager.cancel() を使用します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AndroiderのiOS奮闘記~UIKitとは~

この記事は iOSのキャッチアップを余儀なくされた生粋のAndroiderの奮闘日記です。 単発の記事になりますが、ご容赦ください。 UIKitとは ドキュメント読んでいきます。 Construct and manage a graphical, event-driven user interface for your iOS or tvOS app. iOSとtvOS用に作られたもので、イベント駆動なインターフェースを提供してくれるフレームワークのようです。 iOSシステムとのインタラクティブを管理してくれるようです。 全然知らなかったけど、Apple社はテレビ用のOSも出してるんや。 注意書きとして、UIKitのクラスはメインスレッドのみで使用するのがルールみたいです。 SwiftUIとの違いは SwiftUIもiOSでUIを描画するためのフレームワークですが、新しいものみたいです。 ただ、一つのプロジェクトに両者をブリッジできるようなので、組み合わせて使える。 AndroidでもJetpackComposeを既存のものに組み込めるので、それと同じかなと。 まとめ とりあえず、UIKitというのはUI描画のフレームワークであると。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む