如何使用getCropAndSetWallpaperIntent(Uri imageUri)工作?

那么,有两个问题与此相同( 如何在WallpaperManager中使用getCropAndSetWallpaperIntent方法? 如何使用getCropAndSetWallpaperIntent? ),但两者都没有答案。 希望得到一个答案,我问这个 – 如何使这个方法工作。

这对我的大脑没有帮助的http://developer.android.com/reference/android/app/WallpaperManager.html#getCropAndSetWallpaperIntent(android.net.Uri) 。

这不起作用

WallpaperManager wallpaperManager = WallpaperManager.getInstance(MainActivity.this); Uri uri = Uri.parse("android.resource://lv.revo.inspicfootballhd/drawable/v1"); Intent intent = new Intent(wallpaperManager.getCropAndSetWallpaperIntent(uri)); startActivity(intent); 

logcat显示了这一点

 5891-5891/? E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: lv.revo.inspicfootballhd, PID: 5891 java.lang.IllegalArgumentException: Image URI must be of the content scheme type at android.app.WallpaperManager.getCropAndSetWallpaperIntent(WallpaperManager.java:760) at lv.revo.inspicfootballhd.MainActivity.onTouch(MainActivity.java:236) at android.view.View.dispatchTouchEvent(View.java:7701) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2338) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568) at android.app.Activity.dispatchTouchEvent(Activity.java:2465) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2285) at android.view.View.dispatchPointerEvent(View.java:7886) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:138) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:5144) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611) at dalvik.system.NativeStart.main(Native Method) 

因此,根据文档“将在意图中设置的图像URI。必须是内容URI,其提供者必须将其类型解析为”image / *“”

图像为.jpg格式。 我明天会继续寻找解决方案。 我只是希望更聪明的人知道我的问题的答案。

编辑/更新1:所以我设法将uri改为Content Uri,我相信如此。 是否使用此 – https://stackoverflow.com/a/23223556/2727408

现在它显示了这一点

 java.lang.IllegalArgumentException: Cannot use passed URI to set wallpaper; check that the type returned by ContentProvider matches image/* at android.app.WallpaperManager.getCropAndSetWallpaperIntent(WallpaperManager.java:792) at lv.revo.inspicfootballhd.MainActivity.onTouch(MainActivity.java:244) 

我尝试使用ContentResolver getType(contentURI)检查类型,它返回null。 现在我将尝试找到如何将其更改为image / *

到目前为止,代码看起来像这样

 Uri uri = ResourceToUri(getApplicationContext(), imageArray[j]); File wallpaper_file = new File(uri.getPath()); Uri contentURI = getImageContentUri(getApplicationContext(), wallpaper_file.getAbsolutePath()); ContentResolver cr = this.getContentResolver(); Log.d("CONTENT TYPE: ", "IS: " + cr.getType(contentURI)); Intent intent = new Intent(wallpaperManager.getCropAndSetWallpaperIntent(contentURI)); startActivity(intent); 

谢谢到目前为止。

编辑/更新2:在这里创建了关于我的新问题的新问题: 如何将类型更改为图像/ *

就像错误说的那样,你需要一个内容URI。 内容URI允许您共享具有临时读写权限的文件。

检查: 从文件URI获取内容URI?

 File wallpaper_file = new File(uri.getPath()); Uri contentURI = getImageContentUri(getApplicationContext(),wallpaper_file); ContentResolver cr = this.getContentResolver(); Log.d("CONTENT TYPE: ", "IS: " + cr.getType(contentURI)); Intent intent = new Intent(wallpaperManager.getCropAndSetWallpaperIntent(contentURI)); startActivity(intent); public static Uri getImageContentUri(Context context, File imageFile) { String filePath = imageFile.getAbsolutePath(); Cursor cursor = context.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ", new String[]{filePath}, null); if (cursor != null && cursor.moveToFirst()) { int id = cursor.getInt(cursor .getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + id); } else { if (imageFile.exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, filePath); return context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { return null; } } }