【问题标题】:Wallpaper manager, getCropAndSetWallpaperIntent error壁纸管理器,getCropAndSetWallpaperIntent 错误
【发布时间】:2017-05-12 09:29:57
【问题描述】:

我正在尝试使用 getCropAndSetWallpaperIntent 来裁剪图像并将其保存为墙纸。但我收到错误“getImageUri (Bitmap, Context) in Utils 不能应用于 (Bitmap)”。

这里是代码

public void setAsWallpaper(Bitmap bitmap) {

    WallpaperManager imageView = null;
    bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
    WallpaperManager wm
            = WallpaperManager.getInstance(_context);

    try {
        new Intent(wm.getCropAndSetWallpaperIntent(getImageUri(bitmap))); (**ERROR IS ON THIS LINE**)
        Toast.makeText(_context,
                _context.getString(R.string.toast_wallpaper_set),
                Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(_context,
                _context.getString(R.string.toast_wallpaper_set_failed),
                Toast.LENGTH_SHORT).show();
    }
}

private Uri getImageUri(Bitmap inImage, Context inContext) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(),
            inImage, "Title", null);
    return Uri.parse(path);
}

这是 logcat。

Process: com.example.wallpaper, PID: 25187

java.lang.NullPointerException: Attempt to invoke virtual method 
'android.graphics.drawable.Drawable android.app.WallpaperManager.getDrawable()' on a null object reference
                                                                                   at com.example.wallpaper.util.Utils.setAsWallpaper(Utils.java:90)
                                                                                   at com.example.wallpaper.FullScreenViewActivity.onClick(FullScreenViewActivity.java:267)
                                                                                   at android.view.View.performClick(View.java:5697)
                                                                                   at android.view.View$PerformClick.run(View.java:22526)
                                                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                   at android.os.Looper.loop(Looper.java:158)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

新的错误日志

E/MediaStore: Failed to insert image
                                                                           java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=11235, uid=10207 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
                                                                               at android.os.Parcel.readException(Parcel.java:1620)
                                                                               at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
                                                                               at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
                                                                               at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
                                                                               at android.content.ContentResolver.insert(ContentResolver.java:1284)
                                                                               at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:986)
                                                                               at com.builditpossible.wallpaperpack.util.Utils.getImageUri(Utils.java:107)
                                                                               at com.builditpossible.wallpaperpack.util.Utils.setAsWallpaper(Utils.java:93)
                                                                               at com.builditpossible.wallpaperpack.FullScreenViewActivity.onClick(FullScreenViewActivity.java:259)
                                                                               at android.view.View.performClick(View.java:5697)
                                                                               at android.view.View$PerformClick.run(View.java:22526)
                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:158)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

设置壁纸和下载按钮

@Override
public void onClick(View v) {
    Bitmap bitmap = ((BitmapDrawable) fullImageView.getDrawable())
            .getBitmap();
    switch (v.getId()) {
    // button Download Wallpaper tapped
    case R.id.llDownloadWallpaper:
        utils.saveImageToSDCard(bitmap);
        break;
    // button Set As Wallpaper tapped
    case R.id.llSetWallpaper:
        utils.setAsWallpaper(bitmap);
        break;
    default:
        break;
    }

【问题讨论】:

    标签: android android-intent bitmap


    【解决方案1】:

    NullPointerException 发生是因为您的 imageView 变量是 null 并且您正在尝试对其调用 getDrawable()

    WallpaperManager imageView = null;
    bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
    

    下面也改一下

    new Intent(wm.getCropAndSetWallpaperIntent(getImageUri(bitmap))); (**ERROR IS ON THIS LINE**)
    

    new Intent(wm.getCropAndSetWallpaperIntent(getImageUri(bitmap,_context)));
    

    更新:

    您可以使用下面的代码获取Drawable 的壁纸并将其保存到sdcard。

    final WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
    final Drawable wallpaperDrawable = wallpaperManager.getDrawable();
    

    【讨论】:

    • 你能帮我编辑一下吗?我对安卓不友好。
    • 我认为你不需要以上两行。因为您已经在函数参数中传递了bitmap。所以,删除这两行并检查。
    • 我已经删除了它们,但是“new Intent(wm.getCropAndSetWallpaperIntent(getImageUri(bitmap)));”仍然显示错误(错误在行尾括号中的位图上)。即使我拥有它,它也会要求我创建 getImageUri 方法。
    • 是的,您需要将上下文作为方法的第二个参数作为getImageUri(bitmap, _context) 传递。检查我更新的答案。
    • E/MediaStore: 无法插入图像 java.lang.SecurityException: Permission Denial: 从 pid= 写入 com.android.providers.media.MediaProvider uri content://media/external/images/media 11235, uid=10207 需要 android.permission.WRITE_EXTERNAL_STORAGE 或 grantUriPermission() 和 soo... 检查问题是否有完整错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多