Ngoại lệ bảo mật Java android


8

Trong ứng dụng của tôi, người dùng có khả năng chụp ảnh hoặc thêm ảnh vào ứng dụng. Tôi đang nhận được báo cáo sự cố của java.lang.SecurityException khi ứng dụng cố gắng hiển thị hình ảnh đã lưu trong ImageView

Dòng nó bị lỗi là

holder.imageV.setImageURI(uriParsed);

Tôi đã không thể tự nhân đôi lỗi trên thiết bị của mình hoặc trên thiết bị mô phỏng, tất cả đều hiển thị hình ảnh tốt.

Mã đầy đủ tôi đang sử dụng là

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);
    }
}

Đầu ra từ nhật ký hiển thị trên thiết bị của tôi (3 dự án, một dự án không có hình ảnh)

Dự án: Kiểm tra - Phân tích cú pháp: tập tin:

Dự án: Kiểm tra 3 - Phân tích cú pháp: nội dung: //com.android.providers.media.document/document/image%3A1891

Lỗi

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)

Bạn đã thử xây dựng, một phiên bản phát hành của ứng dụng và bị xáo trộn chưa? Nó có hoạt động không?
Sagar

bạn có thể gửi nhật ký lỗi đầy đủ. Bạn đang sử dụng uri từ bộ lưu trữ điện thoại của bạn?
Amit Tiwary

CNTT sẽ từ bộ nhớ điện thoại hoặc từ trong ứng dụng, tùy thuộc vào việc nó được thêm từ thư viện hay được lấy từ camera trong ứng dụng. Đã thêm sự cố đầy đủ
Ceri Turner

1
Kiểm tra xem những điều sau đây có hài lòng không: Viết quyền và bạn có nhà cung cấp tệp nếu bạn đang lưu vào đường dẫn nội bộ tùy chỉnh.
TheRealChx101

Bạn đang nói rằng bạn đã thử mã trên trình giả lập. Tôi khuyên bạn nên kiểm tra mã liên quan đến phần cứng như vậy trên gần như mọi Phiên bản Android. Bạn đã thử nó trên Android Pie, như các câu trả lời dưới đây gợi ý?
L3n95

Câu trả lời:


4

Tôi nghĩ rằng bạn đang nhận được ngoại lệ Bảo mật trên Android Pie hoặc hệ điều hành mới hơn. Điều này là do trên các hệ thống này, bạn phải khai báo đường dẫn mà ứng dụng của bạn muốn sử dụng.

Vui lòng kiểm tra: https://developer.android.com/reference/android/support/v4/content/FileProvider

Ngoài ra, có thể ứng dụng của bạn đang cố lấy nội dung từ một ứng dụng khác cần có sự cho phép như Google Photos yêu cầu: <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

Kiểm tra điều này: java.lang.SecurityException: Quyền từ chối: nhà cung cấp mở com.google.android.apps.photos.content.GooglePhotosImageProvider


Tôi nhận được nó vào ngày 9, nhưng tôi đang chạy 10 và không thể tự tái tạo nó. Tôi đã cố gắng tái tạo nó vào ngày 9 tương tự hoặc không thể
Ceri Turner

Tôi gặp lỗi này khi cố gắng thực hiện ý định cho ứng dụng thư viện của bên thứ ba (đó là google photos trong trường hợp của tôi) để cho phép chọn ảnh cho ứng dụng của tôi. Vì vậy, có lẽ bạn cũng cần một ứng dụng cần sự cho phép trước khi đưa ra ý định cho nó.
Vatish Sharma

Tôi đã thêm nó và nó vẫn gặp sự cố
Ceri Turner

4

Từ Api 24, bạn không thể truy cập trực tiếp vào Tệp Uris. Bạn cần sử dụng quyền hạn File cho thư mục và sau đó sử dụng

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

Trong AndroidManifes.xml

Thêm vào sau để applicationgắn thẻ. Trong packagename sau đây là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>

nhà cung cấp_paths.xml

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

3

Ngoại lệ này thường được gây ra bằng cách sử dụng imageuri từ ứng dụng của bên thứ ba. Giải pháp là triển khai nhà cung cấp tệp. Bạn có thể nhận được nhiều giải pháp về cách triển khai fileprovider.


Tôi đã tìm kiếm và không thực sự chắc chắn những gì tôi cần thay đổi. Hiện tại tôi đang thêm hình ảnh bằng pastebin.com/Xswi7puK và hiển thị chúng với pastebin.com/EQVvyRnG
Ceri Turner

Không, nó vẫn bị
sập

Tôi đã thử đặt imageUri trong chế độ xem hình ảnh nhưng nó hoạt động tốt với tôi. Giải pháp thay thế là tạo một bitmap từ imageuri và đặt nó thành chế độ xem hình ảnh. Tôi nghĩ rằng có một vấn đề trong imageuri. Bạn lấy nó từ đâu?
AkashToSky

Tôi nhận được cùng một lỗi khi thử với một bitmap. Các hình ảnh đang được thêm bằng cách sử dụng mã ở đây. pastebin.com/Xswi7puK
Ceri Turner

Đối với trường hợp đầu tiên trong onActivityResult photoUri không được chỉ định.
AkashToSky

2

Tôi nghi ngờ điều này phụ thuộc vào các quyền bạn đã triển khai trong AndroidManifest.xmltệp của mình . Nếu bạn đang gỡ lỗi trên API Level 23phiên bản Android hoặc cao hơn thì bạn phải có quyền chạy trong WRITE_EXTERNAL_STORAGEthời gian chạy vì ngoại lệ bảo mật xảy ra do sự cho phép của thiết bị.


Cả đọc và ghi bên ngoài đều đã có trong tệp kê khai.
Ceri Turner

Bằng cách này, WRITE_EXTERNAL_STORAGE sẽ không được chấp nhận trong phiên bản Android tiếp theo.
dùng70

2

Điều này là do tại phiên bản mới đã Android 9giới thiệu một sự FOREGROUND_SERVICEcho phép mới ; các tài liệu nói:

Lưu ý: Các ứng dụng nhắm mục tiêu Android 9 (API level 28)trở lên và sử dụng các dịch vụ nền trước phải yêu cầu FOREGROUND_SERVICE permission. Đây là một quyền bình thường, vì vậy hệ thống sẽ tự động cấp nó cho ứng dụng yêu cầu. Nếu một ứng dụng nhắm mục tiêu API level 28hoặc cao hơn cố gắng tạo dịch vụ nền trước mà không yêu cầu FOREGROUND_SERVICE, hệ thống sẽ ném a SecurityException.

Chỉ cần thêm quyền vào bảng kê khai và nên thực hiện thủ thuật, "trên lý thuyết". Hãy cho chúng tôi biết!! Cái gì đó như:

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

Hãy để những người cố gắng lấy tiền thưởng đó: Bạn có cho phép những quyền này không?:

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

Ngoài ra tôi nghĩ rằng điều này không quá tệ để thử:

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
Tôi đã xem nhanh thông tin và không chắc nó được áp dụng như thế nào
Ceri Turner

AndroidManifest.xml<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> </manifest>
Don Tiếtt

Tôi đã thêm nó và nó vẫn gặp sự cố
Ceri Turner

Bạn đang sử dụng dịch vụ ứng dụng thứ ba ??? Có lẽ thứ 3 đang sử dụng một số quyền không thể sử dụng?
Qiqke

Ứng dụng bên thứ 3 mà nó truy cập là ứng dụng ảnh trên điện thoại. Điều duy nhất tôi có thể nghĩ là tôi đã thay đổi cách truy cập nó một lúc trước và tôi tự hỏi liệu các quyền không bao giờ được đặt để giữ quyền truy cập. Hình ảnh mới được thêm vào từ ảnh hoạt động, nhưng nó xuất hiện những hình ảnh cũ hơn. Đây là cách hình ảnh được thêm vào: pastebin.com/5CcqXQQu
Ceri Turner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.