質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Android

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

Q&A

1回答

1794閲覧

AndroidでOpenCVのImgcodecs.imwrite()による画像保存ができない

yrema

総合スコア286

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Android

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

0グッド

1クリップ

投稿2018/01/02 20:45

タイトルの通りですが、下記のように4つのディレクトリで試してみたところ、
Imgcodecs.imwrite()は全てfalseを返してしまいます。パーミッション周りの設定が何か間違っているのでしょうか?

▼環境
Android 7.1.1 Qua Phone qx(実機)
Android Studio 2.3.3
Min Sdk 21
Target Sdk 26

▼保存処理

java

1 private void saveImage(Mat mat) { 2 Size size = mat.size(); 3 Log.d("size", size.toString()); 4 String nowString = CommonUtils.getNowString("yyyyMMddHHmmss"); // 20180103053231が返ります。 5 String fileName = nowString + ".jpg"; 6 7 boolean success; 8 9 String path1 = getActivity().getFilesDir() + "/" + fileName; 10 Log.d("path1", path1); 11 success = Imgcodecs.imwrite(fileName, mat); 12 Log.d("success", String.valueOf(success)); 13 14 String path2 = getActivity().getCacheDir() + "/" + fileName; 15 Log.d("path2", path2); 16 success = Imgcodecs.imwrite(fileName, mat); 17 Log.d("success", String.valueOf(success)); 18 19 String path3 = getActivity().getExternalFilesDir(null) + "/" + fileName; 20 Log.d("path3", path3); 21 success = Imgcodecs.imwrite(fileName, mat); 22 Log.d("success", String.valueOf(success)); 23 24 String path4 = getActivity().getExternalCacheDir() + "/" + fileName; 25 Log.d("path4", path4); 26 success = Imgcodecs.imwrite(fileName, mat); 27 Log.d("success", String.valueOf(success)); 28 29 getActivity().finish(); 30 }

▼logcat

text

1D/size: 640x480 2D/path1: /data/user/0/パッケージ名/files/20180103053231.jpg 3D/success: false 4D/path2: /data/user/0/パッケージ名/cache/20180103053231.jpg 5D/success: false 6D/path3: /storage/emulated/0/Android/data/パッケージ名/files/20180103053231.jpg 7D/success: false 8D/path4: /storage/emulated/0/Android/data/パッケージ名/cache/20180103053231.jpg 9D/success: false

▼Manifest.xmlのパーミッション

xml

1 <uses-permission android:name="android.permission.CAMERA"/> 2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 3 <uses-feature android:name="android.hardware.camera2" android:required="false"/> 4 <uses-feature android:name="android.hardware.camera2.autofocus" android:required="false"/>

▼パーミッションのリクエスト

java

1 String[] PERMISSIONS = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; 2 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 3 if(!hasAllPermissions(this, PERMISSIONS)){ 4 ActivityCompat.requestPermissions(this, PERMISSIONS, 1); 5 } 6 }

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

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

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

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

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

guest

回答1

0

こんにちは、以下の様にimwriteにpath1などを設定してみてはどうでしょうか?

Androidのことは詳しく分らず的外れな指摘かもですが。。

java

1String path1 = getActivity().getFilesDir() + "/" + fileName; 2Log.d("path1", path1); 3success = Imgcodecs.imwrite(fileName, mat);

java

1String path1 = getActivity().getFilesDir() + "/" + fileName; 2Log.d("path1", path1); 3success = Imgcodecs.imwrite(path1, mat);

投稿2018/01/05 05:53

kjunichi

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問