トップページ > 記事閲覧
Android 10: GetInternalDataPath に読み書きできなくなった
名前:大和団次郎 日時: 2020/11/11 22:33

お世話になってます。 Android 10 (API29) になって、GetInternalDataPath で取得した パスに fopen でファイルの読み書きができなくなったみたいです。 Android 9 まではできていました。 一応、AndroidManifest.xml に android:requestLegacyExternalStorage="true" と宣言すれば、読み書きできるみたいですが(経過措置) Android 11 では、これが効かなくなるようです。 参考: akira-watson.com/android/external-storage-file.html DXライブラリで、Scoped Storage を取得して、 そのパスをもらえる、といった対応はできないでしょうか。
メンテ

Page: 1 |

Re: Android 10: GetInternalDataPath に読み書きできなくなった ( No.1 )
名前:大和団次郎 日時:2020/11/12 07:19

補足します。 Android10 で、必ず、読み書きできないかというと、そういうことはなくて AndroidManifest.xml で android:targetSdkVersion を "29" (Android10対応の意味) 以上にすると読み書きできなくなります。 (例) <manifest .... <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> android:targetSdkVersion が、28 以下だと、エラーは起こりません。 ところが、今年(2020)の8月から、targetSdkVersion を 29以上にしないと、 ストアにアップロードできなくなったので困っています。
メンテ
Re: Android 10: GetInternalDataPath に読み書きできなくなった ( No.2 )
名前:管理人 日時:2020/11/12 20:51

手元に Android10 の端末が無かったので、Android10 のエミュレータを 作成して GetInternalDataPath で取得したパスに fopen でファイルを 開きデータを書き込んでみましたが、正常に書き込み、読みだすこともできました <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29"/> を加えた状態です android:requestLegacyExternalStorage="true" は入れていません GetInternalDataPath ではなく GetExternalDataPath の誤りでしょうか?
メンテ
Re: Android 10: GetInternalDataPath に読み書きできなくなった ( No.3 )
名前:大和団次郎 日時:2020/11/14 08:46

確かめていただき、ありがとうございます。 Android9まで動いていた、DXライブラリでつくった、アプリストアのアプリが、 Anfroid 10 のスマホで保存できないという報告を数件うけています。 それで、以下の実機 Teclast P80h_EEA (Android 10 API29 ARM32)・・・Amazonで8900円(安!) Google Pixel 3a 中古 (Android 11 API30 ARM64)・・じゃんぱらで24000円 で、確かに保存できず、デバッガで追いかけると fopen のポインタがNULLでかえっていました。 ちなみに、Teclast P80h_EEA は新品がすぐ届きましたが、USBデバッグがすぐ切れます・・ データはスマホ内部のアプリ名フォルダ(ファイルマネージャでみえるところ) に保存していて GetExternalDataPath は使っていません。 ただ、Visual Studio 2017 で作成していて、Android Studioへの移行ができておらず Android Studio のエミュレータだと、動くのかもしれません。 もう一度、テストプログラムを作って状況を報告します。
メンテ
Re: Android 10: GetInternalDataPath に読み書きできなくなった ( No.4 )
名前:大和団次郎 日時:2020/11/14 13:58

Android Studio でテストプログラムを作って実機で動かしてみたところ ちゃんと、fopen できました。 何か、複雑な条件があるのかも・・ アプリでは、最初に GetInternalDataPath で取得したパスを覚えておいて あとは、必要なときに、記憶したパスに、fopen しているのですが その時間のずれとか、途中の処理とかで、書き込めなくなったりすることがあるでしょうか・・ もう少し調べてから報告します。
メンテ
Re: Android 10: GetInternalDataPath に読み書きできなくなった ( No.5 )
名前:大和団次郎 日時:2020/11/15 00:56

すみませんでした。勘違いでした。もうしわけありません。 GetInternalDataPath で取得したパスには、ちゃんと書き込みできるようです。 アプリの中で、GetInternalDataPath もつかっていましたが、 書き込めないエラーがおこっていたのは、JNI から Java で Environment.getExternalStorageDirectory().getPath() で取得したパスに、アプリ名をつけたもので、 エラーが発生した場所で、GetInternalDataPath を取得してみると その場所には fopen できました。 Javaから取得して読めなくなったパスは /strage/emulated/0/アプリ名/ で GetInternalDataPath は /data/user/0/com.からはじまるアプリ/files/ でした。 さらに、GetExternalDataPath だと /strage/emulated/0/Android/data/com.からはじまるアプリ/files/ が取得できて、ここも fopen できました。 結局、DXライブラリで取得したパスには、fopen できて、 Javaで取得したパスに、読み書きできなくなるようです。 間違えた情報を書き込んで、すみませんでした。 ファイルリストの表示を、Java上でやっているので Java でもフォルダを取得していて、そのパス名を Cで取得して読み書きしていました。 この仕組みを考え直さないといけないようです・・・
メンテ
Re: Android 10: GetInternalDataPath に読み書きできなくなった ( No.6 )
名前:管理人 日時:2020/11/15 02:31

> すみませんでした。勘違いでした。もうしわけありません。 > > GetInternalDataPath で取得したパスには、ちゃんと書き込みできるようです。 なるほど、そうだったのですね 『現象の確認に多大な労力を費やした』ということもありませんのでどうぞお気になさらず… (・・; ( 私の環境では何故か Android 11 のエミュレータを起動しようとすると即エラーで終了する、ということが分かりました…謎… ) > 書き込めないエラーがおこっていたのは、JNI から Java で >  > Environment.getExternalStorageDirectory().getPath() >  > で取得したパスに、アプリ名をつけたもので、 > エラーが発生した場所で、GetInternalDataPath を取得してみると > その場所には fopen できました。 getInternalStorageDirectory というAPIは無いのですね… getDataDirectory か getDownloadCacheDirectory が GetInternalDataPath で 取得できるパスと同じになりそうな気配がありますが…
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存