🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ストレージ

ストレージとは、データを長期で保管・保存しておくための記憶装置。ハードディスクやDVD、CDなどが主なストレージとして挙げられます。PCでは作成データの他、OSやアプリケーションがインストールされています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

2回答

2455閲覧

[Android]QR画像を生成し、内部ストレージに保存したいです。ですが、保存する処理がうまくいきません。

makoto-n

総合スコア436

ストレージ

ストレージとは、データを長期で保管・保存しておくための記憶装置。ハードディスクやDVD、CDなどが主なストレージとして挙げられます。PCでは作成データの他、OSやアプリケーションがインストールされています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/03/05 06:17

編集2021/03/05 12:16

前提・実現したいこと

アンドロイドアプリを作成中です。
QR画像を生成し、アプリの内部ストレージに保存したいです
ですが、画像生成後、保存する処理がうまくいきません

QR画像をbitmap形式で生成 > 内部ストレージにjpgとして保存したいです

言語は[kotlin]
QRコード生成のライブラリは[ZXing]を使用してます

発生している問題・エラーメッセージ

log

1[logcat] 2 Access denied finding property "ro.serialno 3[debug] 4 java.io.FileNotFoundException: /storage/emulated/0/1.jpg (Permission denied)

該当のソースコード

Kotlin

1/* 2 * 商品追加アクティビティ 3 */ 4 5/* 6* QRコード生成 7*/ 8val size = 500 9val barcodeEncoder = BarcodeEncoder() 10//QRコードをBitmapで作成 11val bitmap = barcodeEncoder.encodeBitmap( 12 thisItmId.toString(), // thisItmId:商品ID 13 BarcodeFormat.QR_CODE, 14 size, 15 size 16) 17 18// 保存処理開始 19val root: File = Environment.getExternalStorageDirectory() 20// ファイル名を[商品Id.jpg]に設定 21// 下記の処理中に、[FileNotFoundException]を発生します 22val fos = FileOutputStream( File(root, thisItmId.toString().plus(".jpg"))) 23 24 25// jpegで保存 26bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos) 27// 保存処理終了 28fos.close()

試したこと

内部ストレージへのアクセス権限の問題と想定し、[AndroidManifest.json]に以下を追記しました。
解決せずログ出力は同じ文言でした。

<uses-permission android:name="android.permission.ASEC_ACCESS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.ASEC_CREATE" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.ASEC_DESTROY" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.ASEC_MOUNT_UNMOUNT" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.ASEC_RENAME" tools:ignore="ProtectedPermissions" />

編集

コメント[保存処理開始]に関する処理を修正しました
が、画像の生成はできていません
スマホから、[アプリ情報>許可>ストレージ]の選択をできるようになり、trueにしています。

Kotlin

1/* 2 * QRコード生成 3 */ 4 5// val root: File = Environment.getExternalStorageDirectory() 6// 保存処理開始 7val fos = FileOutputStream( File(ContextCompat.getDataDir(applicationContext), 8        thisItmId.toString().plus(".jpg"))) 9// jpegで保存 10bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos) 11// 保存処理終了 12fos.close() 13

log

1E/ANDR-PERF: IPerf::tryGetService failed!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

java.io.FileNotFoundException: /storage/emulated/0/1.jpg

path的にはDownloadディレクトリや、Picturesなどのディレクトリがあるところに保存しようとしていないでしょうか?
確か、この階層にはアプリからは保存出来なかった気がします。

特にAndroidQかRからか、データの扱いにはシビアになってきてるので、アプリからもアクセスできる場所とできない場所もあったりしますので、要チェックです。

ちなみに、Androidに関しては質問記載する際は一緒にOSのバージョンも書かれるといいかもです。
OSのバージョン変わるとAPIの中身も若干変わってたりすることがありますので

投稿2021/03/18 12:37

編集2021/03/18 12:40
Daichi

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makoto-n

2021/04/21 12:57

コメントありがとうございます。 業務過多により返信が遅れました、大変申し訳ありません。 Downloadディレクトリなどには保存しようとしておりません。 [アンドロイドのフォルダ/android/data/アプリ名/files/]に保存しようとしています。 現在は[1.jpg]という画像を保存したいのですが、[1.jpg]というディレクトリを生成しております。 バージョン情報ですが ・Kotlin version: 1.4.31 ・Android version: 9 ・Realm: 6.0.2 になります。
guest

0

画像を保存して、後で自分のアプリの中で利用したい場合

ContextCompat.getDataDir(applicationContext)で取得したフォルダに書き込み権限があるはずなので、書き込みができます。
File(ContextCompat.getDataDir(applicationContext), thisItmId.toString().plus(".jpg"))

他のアプリと画像をシェアしたい場合

MediaStoreのinsertを利用します。
以下にその場合のベストプラクティスが書いてあります。
https://developer.android.com/training/data-storage/shared/media#add-item

投稿2021/03/05 10:50

takahirom_dev

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makoto-n

2021/03/05 11:35

回答ありがとうございます。 ベストプラクティスを確認します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問