为什么它适用于安卓 4.4(API 19),但不适用于 7/0(API 24)?从相机获取图像



我需要以高频率保存相机中的图像。我找到了这种方法,但它们不适用于 API 24。问题出在哪里?

String timeStamp = new SimpleDateFormat("HH:mm:ss").format(new Date());
String imageFileName = timeStamp + ".jpg";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName;
File file = new File(pictureImagePath);
Uri outputFileUri = Uri.fromFile(file);
intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, CAM_REQUEST)

受保护的无效活动结果:

File imgFile = new  File(pictureImagePath);
if(imgFile.exists())
bitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

在日志猫上,我看到:

Could not execute method for android:onClick
08-17 22:23:51.934 2003-2003/? E/Zygote: v2
08-17 22:23:51.934 2003-2003/? I/libpersona: KNOX_SDCARD checking this for 10239
08-17 22:23:51.934 2003-2003/? I/libpersona: KNOX_SDCARD not a persona
08-17 22:23:51.936 2003-2003/? E/Zygote: accessInfo : 0
08-17 22:23:51.936 2003-2003/? W/SELinux: SELinux selinux_android_compute_policy_index : Policy Index[2],  Con:u:r:zygote:s0 RAM:SEPF_SECMOBILE_7.0_0005, [-1 -1 -4 -1 0 1]
08-17 22:23:51.938 2003-2003/? I/SELinux: SELinux: seapp_context_lookup: seinfo=untrusted, level=s0:c512,c768, pkgname=com.anhafiz.imagescanner 
08-17 22:23:51.941 2003-2003/? I/art: Late-enabling -Xcheck:jni
08-17 22:23:51.958 2003-2003/? D/TimaKeyStoreProvider: TimaKeyStore is enabled: try add TimaSignature Service and generateKeyPair Service
08-17 22:23:52.181 2003-2003/com.anhafiz.imagescanner W/System: ClassLoader referenced unknown path: /data/app/com.anhafiz.imagescanner-2/lib/arm
08-17 22:23:52.203 2003-2003/com.anhafiz.imagescanner I/InstantRun: starting instant run server: is main process
08-17 22:23:52.284 2003-2003/com.anhafiz.imagescanner W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-17 22:23:52.388 2003-2003/com.anhafiz.imagescanner D/AbsListView: Get MotionRecognitionManager
08-17 22:23:52.391 2003-2003/com.anhafiz.imagescanner D/MotionRecognitionManager: mSContextService = null
08-17 22:23:52.393 2003-2003/com.anhafiz.imagescanner D/MotionRecognitionManager: motionService = com.samsung.android.gesture.IMotionRecognitionService$Stub$Proxy@6ae5181
08-17 22:23:52.425 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: ThreadedRenderer.create() translucent=false
08-17 22:23:52.428 2003-2003/com.anhafiz.imagescanner D/InputTransport: Input channel constructed: fd=73
08-17 22:23:52.428 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: setView = DecorView@ff29c74[MainActivity] touchMode=true
08-17 22:23:52.444 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: dispatchAttachedToWindow
08-17 22:23:52.455 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: Relayout returned: oldFrame=[0,0][0,0] newFrame=[0,0][1536,2048] result=0x7 surface={isValid=true -1564385280} surfaceGenerationChanged=true
08-17 22:23:52.456 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: mHardwareRenderer.initialize() mSurface={isValid=true -1564385280} hwInitialized=true
08-17 22:23:52.462 2003-2032/com.anhafiz.imagescanner I/OpenGLRenderer: Initialized EGL, version 1.4
08-17 22:23:52.462 2003-2032/com.anhafiz.imagescanner D/OpenGLRenderer: Swap behavior 1
08-17 22:23:52.466 2003-2032/com.anhafiz.imagescanner D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1536x2048]-format:1
08-17 22:23:52.482 2003-2003/com.anhafiz.imagescanner W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
08-17 22:23:52.501 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: MSG_RESIZED_REPORT: frame=Rect(0, 0 - 1536, 2048) ci=Rect(0, 48 - 0, 0) vi=Rect(0, 48 - 0, 0) or=1
08-17 22:23:52.501 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1
08-17 22:23:52.501 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: mHardwareRenderer.initializeIfNeeded()#2 mSurface={isValid=true -1564385280}
08-17 22:23:52.502 2003-2003/com.anhafiz.imagescanner V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@7f4b55e nm : com.anhafiz.imagescanner ic=null
08-17 22:23:52.502 2003-2003/com.anhafiz.imagescanner I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
08-17 22:23:52.507 2003-2017/com.anhafiz.imagescanner D/InputTransport: Input channel constructed: fd=79
08-17 22:23:52.565 2003-2003/com.anhafiz.imagescanner V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@7280d3f nm : com.anhafiz.imagescanner ic=null
08-17 22:23:54.174 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: ViewPostImeInputStage processPointer 0
08-17 22:23:54.175 2003-2003/com.anhafiz.imagescanner W/System: ClassLoader referenced unknown path: /system/framework/QPerformance.jar
08-17 22:23:54.176 2003-2003/com.anhafiz.imagescanner E/BoostFramework: BoostFramework() : Exception_1 = java.lang.ClassNotFoundException: Didn't find class "com.qualcomm.qti.Performance" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib, /vendor/lib]]
08-17 22:23:54.176 2003-2003/com.anhafiz.imagescanner V/BoostFramework: BoostFramework() : mPerf = null
08-17 22:23:54.271 2003-2003/com.anhafiz.imagescanner D/ViewRootImpl@4a1dc47[MainActivity]: ViewPostImeInputStage processPointer 1
08-17 22:23:54.284 2003-2003/com.anhafiz.imagescanner D/AndroidRuntime: Shutting down VM
08-17 22:23:54.294 2003-2003/com.anhafiz.imagescanner E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.anhafiz.imagescanner, PID: 2003
  java.lang.IllegalStateException: Could not execute method for android:onClick
      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
      at android.view.View.performClick(View.java:6257)
      at android.widget.TextView.performClick(TextView.java:11149)
      at android.view.View$PerformClick.run(View.java:23705)
      at android.os.Handler.handleCallback(Handler.java:751)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:154)
      at android.app.ActivityThread.main(ActivityThread.java:6776)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
   Caused by: java.lang.reflect.InvocationTargetException
      at java.lang.reflect.Method.invoke(Native Method)
      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
      at android.view.View.performClick(View.java:6257) 
      at android.widget.TextView.performClick(TextView.java:11149) 
      at android.view.View$PerformClick.run(View.java:23705) 
      at android.os.Handler.handleCallback(Handler.java:751) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:154) 
      at android.app.ActivityThread.main(ActivityThread.java:6776) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 
   Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/22%3A23%3A54.jpg exposed beyond app through ClipData.Item.getUri()
      at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
      at android.net.Uri.checkFileUriExposed(Uri.java:2346)
      at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)
      at android.content.Intent.prepareToLeaveProcess(Intent.java:9514)
      at android.content.Intent.prepareToLeaveProcess(Intent.java:9499)
      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1525)
      at android.app.Activity.startActivityForResult(Activity.java:4403)
      at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:54)
      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75)
      at android.app.Activity.startActivityForResult(Activity.java:4362)
      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:708)
      at com.anhafiz.imagescanner.MainActivity.takePhoto(MainActivity.java:58)
      at java.lang.reflect.Method.invoke(Native Method) 
      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
      at android.view.View.performClick(View.java:6257) 
      at android.widget.TextView.performClick(TextView.java:11149) 
      at android.view.View$PerformClick.run(View.java:23705) 
      at android.os.Handler.handleCallback(Handler.java:751) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:154) 
      at android.app.ActivityThread.main(ActivityThread.java:6776) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

问题是 android 改变了 api 24 及更高版本中不同应用程序之间共享 URI 的方式。在你的例子中,你正在与相机应用共享一个 URI。您必须实现 FileOffer 类才能向其他应用授予使用 URI 的权限

看看这个问题和答案,以获得更清晰的信息。

最新更新