Java Androidセキュリティ例外


8

私のアプリでは、ユーザーは写真を撮ったり、アプリに写真を追加したりすることができます。保存した画像をアプリがImageViewに表示しようとすると、java.lang.SecurityExceptionのクラッシュレポートが表示されます

エラーが発生する行は

holder.imageV.setImageURI(uriParsed);

私は自分のデバイスまたはシミュレーターで自分でエラーを再現することができませんでした。それらはすべて画像をうまく表示します。

私が使用している完全なコードは

JoinProjectPicture projectPicture = mProjects.get(position);
Project current = projectPicture.getProject();
Picture picture = projectPicture.getPicture();

 holder.projectName.setText(current.getProjectName() + "(" + current.getWidth() + "x" + current.getHeight() + ")");
 holder.projectStatusTV.setText(current.getStatus());

 if(picture != null) {
      String pictureName = picture.getPictureName();
      Uri uriParsed = Uri.parse(pictureName);

      if(uriParsed != null) {
           Log.d("URIParsed", "Project: " + current.getProjectName() + " - Parsed: " + uriParsed);
           holder.imageV.setImageURI(uriParsed);
    }
}

デバイスに表示されるログの出力(3つのプロジェクト、1つはイメージなし)

プロジェクト:テスト-解析:file:///storage/emulated/0/Android/data/com.desbrina.diamondpaintinglogbook/files/Pictures/20191111_1408166491573472523237896.jpg

プロジェクト:テスト3-解析:content://com.android.providers.media.documents/document/image%3A1891

エラー

java.lang.SecurityException: 
  at android.os.Parcel.createException (Parcel.java:1966)
  at android.os.Parcel.readException (Parcel.java:1934)
  at android.os.Parcel.readException (Parcel.java:1884)
  at android.app.IActivityManager$Stub$Proxy.getContentProvider (IActivityManager.java:4039)
  at android.app.ActivityThread.acquireProvider (ActivityThread.java:6365)
  at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider (ContextImpl.java:2825)
  at android.content.ContentResolver.acquireUnstableProvider (ContentResolver.java:1835)
  at android.content.ContentResolver.openTypedAssetFileDescriptor (ContentResolver.java:1449)
  at android.content.ContentResolver.openAssetFileDescriptor (ContentResolver.java:1302)
  at android.content.ContentResolver.openAssetFileDescriptor (ContentResolver.java:1225)
  at android.graphics.ImageDecoder$ContentResolverSource.createImageDecoder (ImageDecoder.java:273)
  at android.graphics.ImageDecoder.decodeDrawableImpl (ImageDecoder.java:1652)
  at android.graphics.ImageDecoder.decodeDrawable (ImageDecoder.java:1645)
  at android.widget.ImageView.getDrawableFromUri (ImageView.java:952)
  at android.widget.ImageView.resolveUri (ImageView.java:921)
  at android.widget.ImageView.setImageURI (ImageView.java:532)
  at android.support.v7.widget.AppCompatImageView.setImageURI (AppCompatImageView.java:116)
  at com.desbrina.diamondpaintinglogbook.ui.main.Adapters.ProjectListAdapter.onBindViewHolder (ProjectListAdapter.java:88)
  at com.desbrina.diamondpaintinglogbook.ui.main.Adapters.ProjectListAdapter.onBindViewHolder (ProjectListAdapter.java:23)
  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder (RecyclerView.java:6781)
  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder (RecyclerView.java:6823)
  at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline (RecyclerView.java:5752)
  at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:6019)
  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5858)
  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5854)
  at android.support.v7.widget.LinearLayoutManager$LayoutState.next (LinearLayoutManager.java:2230)
  at android.support.v7.widget.LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1557)
  at android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1517)
  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:612)
  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2 (RecyclerView.java:3924)
  at android.support.v7.widget.RecyclerView.dispatchLayout (RecyclerView.java:3641)
  at android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:4194)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.support.constraint.ConstraintLayout.onLayout (ConstraintLayout.java:1915)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.support.v4.view.ViewPager.onLayout (ViewPager.java:1775)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
  at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
  at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
  at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
  at com.android.internal.policy.DecorView.onLayout (DecorView.java:1088)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.view.ViewRootImpl.performLayout (ViewRootImpl.java:3417)
  at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2884)
  at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1932)
  at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:8589)
  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:949)
  at android.view.Choreographer.doCallbacks (Choreographer.java:761)
  at android.view.Choreographer.doFrame (Choreographer.java:696)
  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:935)
  at android.os.Handler.handleCallback (Handler.java:873)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:214)
  at android.app.ActivityThread.main (ActivityThread.java:7094)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:494)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:975)
Caused by: android.os.RemoteException: 
  at com.android.server.am.ActivityManagerService.getContentProviderImpl (ActivityManagerService.java:15677)
  at com.android.server.am.ActivityManagerService.getContentProviderImpl (ActivityManagerService.java:15586)
  at com.android.server.am.ActivityManagerService.getContentProvider (ActivityManagerService.java:16151)
  at android.app.IActivityManager$Stub.onTransact$getContentProvider$ (IActivityManager.java:11035)
  at android.app.IActivityManager$Stub.onTransact (IActivityManager.java:295)

難読化されたリリースバージョンのアプリをビルドしてテストしようとしましたか?うまくいきますか?
Sagar

完全なエラーログを投稿できますか。携帯電話のストレージからURIを使用していますか?
アミットティワリー

ITは、ギャラリーから追加されたか、アプリのカメラから取得されたかに応じて、電話のストレージまたはアプリ内から取得されます。完全なクラッシュが追加されました
Ceri Turner

1
次の条件が満たされていることを確認します。書き込み権限、およびカスタム内部パスに保存する場合はファイルプロバイダーがあることを確認します。
TheRealChx101

あなたはエミュレーターでコードを試したと言っています。このようなハードウェア関連のコードを、ほぼすべてのAndroidバージョンでテストすることをお勧めします。以下の答えが示唆するように、Android Pieで試しましたか?
L3n95

回答:


4

Android Pie以降のオペレーティングシステムでセキュリティ例外が発生していると思います。これは、これらのシステムでは、アプリが使用するパスを宣言する必要があるためです。

確認してください:https : //developer.android.com/reference/android/support/v4/content/FileProvider

また、アプリがGoogleフォトなどの許可が必要な別のアプリからコンテンツを取得しようとしている可能性があります。 <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

これを確認してください:java.lang.SecurityException:Permission Denial:open provider com.google.android.apps.photos.content.GooglePhotosImageProvider


9で取得していますが、10を実行しているため、自分では再現できません。私は同様に9で再現しようとしましたが、できませんでした
Ceri Turner

サードパーティ(私の場合はgoogle写真)のギャラリーアプリにインテントを起動して、アプリの写真を選択しようとすると、このエラーが発生します。したがって、おそらく、意図を与える前に許可を必要とするアプリも必要です。
Vatish Sharma

私はそれを追加しましたが、それでもクラッシュします
Ceri Turner

4

Apiから24、File Urisに直接アクセスすることはできません。フォルダーのファイル権限を使用してから使用する必要があります

val photoURI = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", File(path));

ではAndroidManifes.xml

以下をapplicationタグに追加します。次のパッケージ名はBuildConfig.APPLICATION_ID

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="packagename.provider"
            android:enabled="true"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external"
        path="." />
</paths>

3

この例外は通常、サードパーティのアプリからのimageuriの使用が原因で発生します。解決策は、ファイルプロバイダーを実装することです。ファイルプロバイダーを実装する方法に関する多くの解決策を得ることができます。


私は何を変更する必要があるかを探していて、本当にわかりません。現在、pastebin.com
Xswi7puK

いいえ、まだクラッシュしています
Ceri Turner

imageUriをimageviewに設定してみましたが、問題なく動作しました。代替ソリューションは、imageuriからビットマップを作成し、それをimageviewに設定することです。imageuriに問題があると思います。どこから取得していますか?
AkashToSky

ビットマップで同じエラーが発生します。ここのコードを使用して画像を追加しています。pastebin.com/Xswi7puK
Ceri Turner

onActivityResultの最初のケースでは、photoUriが割り当てられていません。
AkashToSky

2

これはあなたがあなたのAndroidManifest.xmlファイルに実装したパーミッションにあると思います。API Level 23Androidの以降のバージョンでデバッグする場合WRITE_EXTERNAL_STORAGEは、デバイスによって拒否された権限によりセキュリティ例外が発生するため、ランタイム時にランタイム権限を取得する必要があります。


外部読み取りと外部書き込みの両方が既にマニフェストファイルにあります。
Ceri Turner、

ちなみに、WRITE_EXTERNAL_STORAGEは、次のAndroidバージョンで廃止される予定です。
user70

2

これは、新しいバージョンAndroid 9で新しいFOREGROUND_SERVICE権限が導入されたためです。ドキュメントは言う:

注:をターゲットにしてAndroid 9 (API level 28)フォアグラウンドサービスを使用するアプリは、をリクエストする必要がありますFOREGROUND_SERVICE permission。これは通常の権限であるため、システムはそれを要求元のアプリに自動的に付与します。ターゲットAPI level 28以上のアプリがリクエストせずにフォアグラウンドサービスを作成しようとするFOREGROUND_SERVICEと、システムはをスローしSecurityExceptionます。

マニフェストに許可を追加するだけで、「理論的には」トリックを実行できます。我々に教えてください!!何かのようなもの:

<manifest ...>   
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> 
     <application ...>
</manifest>

その賞金を獲得しようとします:これらの許可を妨げますか?:

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

また、これは試してみるにはそれほど悪くはないと思います:

public static final String KITKAT_VALUE = 1002;

  Intent intent;

    if (Build.VERSION.SDK_INT < 19){
                            intent = new Intent();
                            intent.setAction(Intent.ACTION_GET_CONTENT);
                            intent.setType("image/*");
                            startActivityForResult(intent, KITKAT_VALUE);
                        } else {
                            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                            intent.addCategory(Intent.CATEGORY_OPENABLE);
                            intent.setType("image/*");
                            startActivityForResult(intent, KITKAT_VALUE);
                    }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == KITKAT_VALUE ) {
     if (resultCode == Activity.RESULT_OK) {
       // do something here
     }
  }
}

1
私は情報を
ざっと

次のAndroidManifest.xmlようなすべての権限を配置する場所と呼ばれるファイルを持っていませんか?<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> </manifest>
Qiqke

私はそれを追加しましたが、それでもクラッシュします
Ceri Turner

3番目のアプリサービスを使用していますか?多分その3番目は使用できないいくつかの権限を使用していますか?
Qiqke

アクセスするサードパーティのアプリは電話の写真アプリです。私が考えることができる唯一のことは、私がそれへのアクセス方法を少し前に変更したことです。写真から新しく追加された画像は機能しますが、古い画像は機能しないようです。これが画像の追加方法です。pastebin.com
5CcqXQQu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.