Android 11 では、写真をアップロードできない、保存できない、読み書きできない問題、カメラを選択して写真を撮る、写真が返ってこない、という問題の解決策
最近、同社が開発したアプリに突然問題が発生し、ユーザーが携帯電話のカメラ機能を使用してアプリに写真をアップロードすると、写真をアップロードできなくなりました。アプリの最後の更新から数か月が経過していたため、この問題が発生したときは非常に混乱しました. 特定の機能に突然問題が発生するのは非常に奇妙ですが、それを解決する方法はありません. その結果、問題を再現することはできません。. . 最終的に、同社のテスト用携帯電話は Android 10 であり、問題はなく、問題は Android 11 携帯電話でのみ再現できることがわかりました。. . 非常に無言。
「Tucao が Tucao に戻ってきました。問題はまだ解決する必要があります。Android 11 にはパーティション ストレージに関するさらなる制限があることは知っていますが、最初はそのことについて考えていませんでした。数日間の苦労の末、ようやく Android 11 を見つけました。」元のコードのパーティション保存は、写真を撮った後に携帯電話に写真を保存するように要求するコードで問題を引き起こしました。以前のコードは比較的古いため、パーミッションのリクエストはあまり標準化されていませんでした.Android 11 より前では、比較的寛容でエラーは報告されませんでしたが、アップデート後に失敗しました.次に、正しいコードを書きます.
1. 最初に読み取りと書き込みのアクセス許可を追加し
、次の 2 つの段落を AndroidManifest.xml に追加します。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2. res/xml フォルダーにファイルを追加するには、
プロバイダーが外部ストレージのアクセス許可を申請する必要があります。コードは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_download" path="Download"/>
</paths>
3. AndroidManifest.xml の application タグにプロバイダーを追加する
ステップ 2 でプロバイダー ファイルを追加した後、このステップで呼び出して参加します
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="(这里写自己项目的包名).provider"
tools:replace="android:authorities"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
4. (重要なステップ) 携帯電話のカメラを呼び出して写真を撮るように適用します.
Android 11 が写真を撮れない場合, 基本的にこのコードの問題です. 正しいコードは次のようになります:
Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= 24) {
//大于7.0使用此方法
if(captureIntent.resolveActivity(getPackageManager())!=null){
//toFile 是图片保存在手机中的路径,这段代码我就不贴了,因为网上都有,而且都是没问题的
if(toFile!=null){
//这里的provider要和第三步的一样
Uri photoURI= FileProvider.getUriForFile(getApplicationContext(),"(自己项目的包名).provider",toFile);
captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
startActivityForResult(captureIntent,GalleryFinal.TAKE_REQUEST_CODE);
}
}
}
まとめ: 上記の 4 つの手順を実行することで、写真撮影の許可の問題によって実行できないさまざまな問題を修復できます。Android の現在のパーミッション制限はますます厳しくなっているため、コードを記述するときは、より標準化されるように最善を尽くす必要があります。みんなを助けることを願っています。