Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Capture view and Register to gallery
Search
umechanhika
January 17, 2020
Programming
68
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Capture view and Register to gallery
umechanhika
January 17, 2020
More Decks by umechanhika
See All by umechanhika
My Workspace [2020/08版]
umechanhika
0
110
My Workspace [2020/06版]
umechanhika
0
57
Badging for Tabs and Bottom Navigation
umechanhika
0
390
Shape Design with Material Components
umechanhika
3
270
Firebase MLKit AutoML Vision Edgeを触ってみた
umechanhika
3
590
Google Play Consoleの時間指定公開のハマりポイント
umechanhika
1
1.6k
UIテスト初心者のチームにUIテスト自動化を導入した話
umechanhika
0
120
GoogleI/Oアプリのようなフィルター機能を実装する
umechanhika
2
550
Jenkins + Bitbucketでアプリリリースを自動化してみた
umechanhika
1
690
Other Decks in Programming
See All in Programming
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
140
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
960
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
130
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
140
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
510
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
0
290
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
460
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.1k
yield再入門 #phpcon
o0h
PRO
0
480
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
190
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.9k
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
55
12k
Crafting Experiences
bethany
1
220
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
390
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
RailsConf 2023
tenderlove
30
1.5k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Transcript
Capture view and Register to gallery
About me Hikaru Umetsu (@umechanhika) WealthNavi Inc. Individual developer Fav:
Android & Flutter Individual Job
What is “capture”? App screen Image file
Overview Capture view File storage access Register to gallery Summary
Capture view view.isDrawingCacheEnabled = true val cache = view.drawingCache val
bitmap = Bitmap.createBitmap(cache) val bitmap = view.drawToBitmap() val canvas = Canvas(bitmap) view.draw(canvas) Deprecated New https://github.com/umechanhika/playground/blob/master/android/AddScreenshotToGallery/app/ src/main/java/com/example/addscreenshottogallery/ui/util/ScreenshotUtil.kt
File storage access In this case: MediaStore API Is this
... Media file? Yes Shareable? Yes Removed on app uninstalled? No https://developer.android.com/training/data-storage
Permission https://developer.android.com/training/data-storage No need on Android 10 or higher <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
Register to gallery Android 10 or higher Android 9 or
lower Create ContentValues Save bitmap Create ContentValues Save bitmap Register to MediaStore Register to MediaStore
Register to gallery Android 10 or higher Android 9 or
lower Create ContentValues Save bitmap Create ContentValues Save bitmap Register to MediaStore Register to MediaStore
Register to gallery ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "fileName.jpg") put(MediaStore.Images.Media.TITLE, "fileName") put(MediaStore.Images.Media.MIME_TYPE,
"image/jpeg") put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1_000) } Create ContentValues https://github.com/umechanhika/playground/blob/master/android/AddScreenshotToGallery/app/ src/main/java/com/example/addscreenshottogallery/ui/util/ScreenshotUtil.kt Common
Register to gallery ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "fileName.jpg") put(MediaStore.Images.Media.TITLE, "fileName") put(MediaStore.Images.Media.MIME_TYPE,
"image/jpeg") put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1_000) } Create ContentValues https://github.com/umechanhika/playground/blob/master/android/AddScreenshotToGallery/app/ src/main/java/com/example/addscreenshottogallery/ui/util/ScreenshotUtil.kt Common
Register to gallery ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "fileName.jpg") put(MediaStore.Images.Media.TITLE, "fileName") put(MediaStore.Images.Media.MIME_TYPE,
"image/jpeg") put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1_000) } Create ContentValues https://github.com/umechanhika/playground/blob/master/android/AddScreenshotToGallery/app/ src/main/java/com/example/addscreenshottogallery/ui/util/ScreenshotUtil.kt Common
Register to gallery ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "fileName.jpg") put(MediaStore.Images.Media.TITLE, "fileName") put(MediaStore.Images.Media.MIME_TYPE,
"image/jpeg") put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1_000) } Create ContentValues https://github.com/umechanhika/playground/blob/master/android/AddScreenshotToGallery/app/ src/main/java/com/example/addscreenshottogallery/ui/util/ScreenshotUtil.kt Common
Register to gallery ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "fileName.jpg") put(MediaStore.Images.Media.TITLE, "fileName") put(MediaStore.Images.Media.MIME_TYPE,
"image/jpeg") put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1_000) } Create ContentValues https://github.com/umechanhika/playground/blob/master/android/AddScreenshotToGallery/app/ src/main/java/com/example/addscreenshottogallery/ui/util/ScreenshotUtil.kt Common
Register to gallery Register to MediaStore contentValues.apply { put( MediaStore.Images.Media.RELATIVE_PATH,
"${Environment.DIRECTORY_PICTURES}/DirectoryName" ) put(MediaStore.MediaColumns.IS_PENDING, 1) } contentResolver.run { uri = insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) ?: return // ... } Android 10 or higher https://github.com/umechanhika/playground/blob/master/android/AddScreenshotToGallery/app/ src/main/java/com/example/addscreenshottogallery/ui/util/ScreenshotUtil.kt
Register to gallery Save bitmap contentResolver.run { uri = insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues) ?: return openOutputStream(uri).use { bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it) } contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0) update(uri, contentValues, null, null) } Android 10 or higher https://github.com/umechanhika/playground/blob/master/android/AddScreenshotToGallery/app/ src/main/java/com/example/addscreenshottogallery/ui/util/ScreenshotUtil.kt
Completed
Drawing cache is deprecated. Use MediaStore API. No need permission
on Android 10 or higher Register process is different from Android 10 or higher Summary
Thanks!