8

アップデート

8.0.0 T-Mobile を実行している Samsung Galaxy S8+ を持っていますが、8.0.0 を実行しても問題なく動作します。

8.0.0 Verizon を実行している私の Samsung Galaxy S9+ は、不正な引数で毎回失敗します。

8.0.0 T-Mobile を実行している Samsung Galaxy S9+ には問題がなく、正常に動作します

したがって、これは OEM 固有のモデルの問題である可能性がありますが、まだ修正方法がわかりません。電話の再起動も試みましたが、結果は変わりませんでした。

また、Evernote 内から公開ダウンロードを開き、ファイルを添付ファイルとしてノートに保存しました。これは、Evernote が公開ディレクトリに問題なくアクセスしてファイルを添付できることを示しているため、デバイス上で実行できます。それがコード関連であると私に信じさせます。


そのため、最近、正常に機能していたプロジェクトをアップグレードしましたが、最新バージョンの Android 用にビルド ツール 28 でコンパイルしているため、バグが発生しています。

したがって、私は常にこの PathUtil を使用して、ユーザーからファイルを選択するという暗黙の意図から必要なファイル パスを取得してきました。以下に、私が長い間使用しているコードへのリンクを共有します。

PathUtil

これは、プロバイダーの権限をチェックし、読み取ろうとしているファイルの絶対パスを取得する単なるユーティリティ クラスです。

ユーザーがパブリック ダウンロード ディレクトリからファイルを選択すると、onActivityResultに次のように返されます。

content://com.android.providers.downloads.documents/document/2025

これで、nice ユーティリティがこれを解析し、これがダウンロード ディレクトリ ファイルであり、ID が 2025 のドキュメントであることを教えてくれます。

次は、コンテンツ リゾルバーを使用してファイルの絶対パスを見つけます。これは以前は機能していましたが、機能しなくなりました:(。

現在、パス ユーティリティは、コア ライブラリ自体から取得した可能性が最も高いコントラクト データを使用するだけです。静的文字列を避けるためにプロバイダー クラスをインポートしようとしましたが、利用できないようです。そのため、一致する文字列を使用するのが今のところ最善の方法だと思います。

コンテンツ リゾルバーにすべてのアクセスを提供するコア DownloadProvider を参照用に示します。 ダウンロードプロバイダー

注* この DownloadProvider は Android であり、私のものではありません

contentProvider の Uri を構築するコードは次のとおりです。

 val id = DocumentsContract.getDocumentId(uri)
 val contentUri = ContentUris.withAppendedId(Uri.parse(PUBLIC_DOWNLOAD_PATH), id.toLong())
 return getDataColumn(context, contentUri, null, null)

呼び出し参照:

    private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array<String>?): String? {
        var cursor: Cursor? = null
        val column = "_data"
        val projection = arrayOf(column)
        try {
            cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
            if (cursor != null && cursor.moveToFirst()) {
                val column_index = cursor.getColumnIndexOrThrow(column)
                return cursor.getString(column_index)
            }
        }catch (ex: Exception){
            A35Log.e("PathUtils", "Error getting uri for cursor to read file: ${ex.message}")
        } finally {
            if (cursor != null)
                cursor.close()
        }
        return null
    }

基本的に解決される contentUri は

content://downloads/public_downloads/2025

次に、クエリ メソッドを呼び出すと、次のメッセージがスローされます。

java.lang.IllegalArgumentException: 不明な URI: content://downloads/public_downloads/2025

確認・試したこと

  1. 外部アクセス許可の読み取り (書き込みが付属していますが、とにかく実行しました)
  2. 外部権限の書き込み
  3. 権限はマニフェストにあり、実行時に取得されます
  4. 複数の異なるファイルを選択して、1 つがおかしいかどうかを確認しました
  5. アプリケーション設定で権限が付与されていることを確認しました
  6. Uri を /1 または最後に /#2052 にハードコーディングして、さまざまなエンディング タイプを試しました。
  7. コア ライブラリの uriMatching を調査して、フォーマットがどのように期待されるかを調べ、一致することを確認しました
  8. 私は uri の all_downloads ディレクトリをいじってみましたが、解決しました!! しかし、セキュリティ例外があるため、リゾルバーが存在する必要があります。

他に何を試すべきかわかりません。助けていただければ幸いです。

4

3 に答える 3