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 で
取得できるパスと同じになりそうな気配がありますが…
|