oliexdev / openWorkout

Simple workout trainer that puts your privacy first
GNU General Public License v3.0
124 stars 17 forks source link

App crashed after deleting custom exercise images. #17

Closed vricci closed 3 years ago

vricci commented 3 years ago

Possible bug with the app handling of images. I created a custom workout and added some exercises with custom images. I was expecting that open workout made a backup of such images in some internal data folder, so I moved the images from my phone into the recycle bin using the gallery app. After that trying to open my custom workout causes the application to crash. Trying to restore the images into the original folder didn't solve the issue.

Here is a log of the crash:

`Build version: 1.2 Build date: 1979-11-30 01:00:00 Current date: 2020-10-31 08:17:16 Device: Motorola moto g(8) power

Stack trace:
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{cd4ab38 27687:com.health.openworkout/u0a225} (pid=27687, uid=10225) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs at android.os.Parcel.createException(Parcel.java:2071) at android.os.Parcel.readException(Parcel.java:2039) at android.os.Parcel.readException(Parcel.java:1987) at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:5226) at android.app.ActivityThread.acquireProvider(ActivityThread.java:6802) at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2748) at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:2117) at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1671) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1503) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1420) at android.graphics.ImageDecoder$ContentResolverSource.createImageDecoder(ImageDecoder.java:277) at android.graphics.ImageDecoder.decodeDrawableImpl(ImageDecoder.java:1743) at android.graphics.ImageDecoder.decodeDrawable(ImageDecoder.java:1736) at android.widget.ImageView.getDrawableFromUri(ImageView.java:1022) at android.widget.ImageView.resolveUri(ImageView.java:991) at android.widget.ImageView.setImageURI(ImageView.java:568) at b.b.q.n.setImageURI(Unknown Source:0) at d.c.a.b.f.n.a(:1) at androidx.recyclerview.widget.RecyclerView$t.a(:98) at androidx.recyclerview.widget.LinearLayoutManager$c.a(:5) at androidx.recyclerview.widget.LinearLayoutManager.a(Unknown Source:0) at androidx.recyclerview.widget.LinearLayoutManager.a(:6) at androidx.recyclerview.widget.LinearLayoutManager.c(:22) at androidx.recyclerview.widget.RecyclerView.f(Unknown Source:38) at androidx.recyclerview.widget.RecyclerView.d(:6) at androidx.recyclerview.widget.RecyclerView.onLayout(Unknown Source:5) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at androidx.constraintlayout.widget.ConstraintLayout.onLayout(Unknown Source:70) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at androidx.constraintlayout.widget.ConstraintLayout.onLayout(Unknown Source:70) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at d.b.a.a.m.f.b(:6) at d.b.a.a.m.g.a(Unknown Source:0) at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(:2) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at androidx.drawerlayout.widget.DrawerLayout.onLayout(Unknown Source:57) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673) at android.widget.LinearLayout.onLayout(LinearLayout.java:1582) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673) at android.widget.LinearLayout.onLayout(LinearLayout.java:1582) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at com.android.internal.policy.DecorView.onLayout(DecorView.java:799) at android.view.View.layout(View.java:21973) at android.view.ViewGroup.layout(ViewGroup.java:6263) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3108) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2618) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1749) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7692) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966) at android.view.Choreographer.doCallbacks(Choreographer.java:790) at android.view.Choreographer.doFrame(Choreographer.java:725) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:241) at android.app.ActivityThread.main(ActivityThread.java:7604) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.am.ActivityManagerService.getContentProviderImpl(ActivityManagerService.java:7210) at com.android.server.am.ActivityManagerService.getContentProvider(ActivityManagerService.java:7639) at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2169) at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3007) at android.os.Binder.execTransactInternal(Binder.java:1036)

`

oliexdev commented 3 years ago

Thanks the error should be catch now. The problem is the new security model in Android. You need the permission to read an external file via an open dialog. If you move the file and restore it the internal permission is not granted anymore. I will store all images/videos internally if you export and import your new training.

vricci commented 3 years ago

Thank you very much, for fixing the bug and for the app in general.