2

アンインストールして再インストールすると、アプリケーションは外部ストレージのアプリケーション フォルダ ( ) に書き込めなく<sdcard>/Android/data/<applicationpackage>/filesなり、MediaStore プロバイダと連携できなくなり、Storage Access Framework を使用して SD カードの他のファイルにアクセスできなくなります。この問題はランダムに発生しますが、非常に一般的であり、多くのデバイスで簡単に再現できます。

SD カードを搭載した多くの Android 5.x デバイスで再生できます: LG G3 VS985 4G (5.1.1)、LG G Pad V500 (5.0.2)、Alcatel Idol 3、Nvidia SHIELD Tablet K1 (5.1.1)、Verizon SM-G900V (5.0)、およびその他の LG、Alcatel、Asus デバイス...

再現する手順:

  1. アプリケーションをインストール
  2. <sdcard>/Android/data/<applicationpackage>/filesSD カードのアプリケーションフォルダ ( ) にいくつかのファイルを作成します。このフォルダの UID は、たとえば 10206 です。アプリケーションの UID も 10206 です。SD カードへのアクセスは正常に機能します。Storage Access Framework 経由でアプリケーション フォルダーにアクセスしたり、他のフォルダーにアクセスしたりできます
  3. アプリケーションのアンインストール - SD カードのアプリケーション フォルダが正しく削除されます。
  4. アプリケーションの再インストール (再インストールの前に完全にアンインストールする必要があります。アプリケーションを更新することにより、アプリケーションを再現することはできません。)

次の 3 つのケースのいずれかが発生する可能性があります。

ケース A) バグなし: アプリケーションの UID がたとえば 10207 に増加し、SD カードのアプリケーション フォルダの UID が同じ - 10207 で、すべて正常に動作します。アプリケーション フォルダーにアクセスしたり、ストレージ アクセス フレームワークを介して他のフォルダーにアクセスしたりできます。

ケース B) バグ: SD カードのアプリとアプリケーション フォルダーの両方の UID は増加せず、10206 のままですが、内部 (システム内) でこのアプリケーション パッケージの UID は明らかに既に異なっています。これにより、次の例外が発生します。

Caused by: java.lang.SecurityException: Package <applicationpackage> does not belong to calling UID 10206
  at android.os.Parcel.readException(Parcel.java:1540)
  at android.os.Parcel.readException(Parcel.java:1493)
  at android.app.ActivityManagerProxy.getPersistedUriPermissions(ActivityManagerNative.java:3947)
  at android.content.ContentResolver.getPersistedUriPermissions(ContentResolver.java:1715)

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/file from pid=3322, uid=10206 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
  at android.os.Parcel.readException(Parcel.java:1540)
  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
  at android.content.ContentProviderProxy.query(ContentProviderNative.java:420)
  at android.content.ContentResolver.query(ContentResolver.java:502)
  at android.content.ContentResolver.query(ContentResolver.java:446)

手順 3. と 4. を繰り返した後、ケース C) が常に発生します。ほとんどの場合、ケース C) はケース B) なしですぐに発生し、手順 3. a 4. を繰り返します。

ケース C) バグ: アプリの UID は 10207 などに増加しますが、アプリケーション フォルダー ( <sdcard>/Android/data/<applicationpackage>/files) の UID は 10206 のままで、アプリケーションからアクセスできません。これにより、次の例外が発生します。

Caused by: java.io.FileNotFoundException: /storage/sdcard1/Android/data/<applicationpackage>/files/somefolder/somefile.xml: open failed: ENOENT (No such file or directory)
  at libcore.io.IoBridge.open(IoBridge.java:456)
  at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
  at java.io.FileOutputStream.<init>(FileOutputStream.java:72)

それ以上のアンインストールと再インストールは役に立ちません。アプリケーションフォルダのUIDは10206のまま!アプリのUIDは、再インストールするたびに(正しく)変更されます。唯一の回避策は、デバイスの再起動です。再起動後、アプリケーション UID に従って、アプリケーション フォルダの UID が更新されます。その後、次のアンインストールまですべて正常に動作します。そのため、ユーザーにデバイスの再起動を強制する必要があります。

ノート:

  • 次の方法でアプリケーション UID を取得します。android.os.Process.myUid()
  • 次の方法でアプリケーション フォルダの UID を取得します。Os.stat("<sdcard>/Android/data/<applicationpackage>/files").st_uid

私はかなり長い間この問題に直面しており、今ではそれが何らかの形で異なる UID に関連していると確信しています。うまく修正または回避する方法がわかりません。

4

0 に答える 0