【问题标题】:Wallpaper not properly fit on device screen壁纸不适合设备屏幕
【发布时间】:2014-05-10 15:52:14
【问题描述】:

我在一个可绘制文件夹中有一组图像。我有一个按钮可以将图像设置为设备屏幕上的墙纸。但是当我将此图像设置为墙纸时,它要么缩放要么裁剪。我希望图像应该适合屏幕尺寸。我在 SO 上看到了很多链接,但没有一个链接对我有用。这是我目前正在尝试的代码。

代码-

Bitmap bmap2 = BitmapFactory.decodeStream(getResources().openRawResource(mThumb[position]));
DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels; 
int width = metrics.widthPixels;
Bitmap bitmap = Bitmap.createScaledBitmap(bmap2, width, height, true); 
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
try {
  wallpaperManager.setBitmap(bitmap);
  } catch (IOException e) {
  e.printStackTrace();
}

我还在清单中添加了以下几行-

<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="android.permission.SET_WALLPAPER" />

【问题讨论】:

标签: android wallpaper


【解决方案1】:

您好,这是我检查过的可绘制图像..

                DisplayMetrics metrics = new DisplayMetrics(); 
                getWindowManager().getDefaultDisplay().getMetrics(metrics);
                int height = metrics.heightPixels; 
                int width = metrics.widthPixels;
                Bitmap tempbitMap = BitmapFactory.decodeResource(getResources(), R.drawable.img);
                Bitmap bitmap = Bitmap.createScaledBitmap(tempbitMap,width,height, true);
                WallpaperManager wallpaperManager = WallpaperManager.getInstance(MainActivity.this); 
                wallpaperManager.setWallpaperOffsetSteps(1, 1);
                wallpaperManager.suggestDesiredDimensions(width, height);
                try {
                  wallpaperManager.setBitmap(bitmap);
                  } catch (IOException e) {
                  e.printStackTrace();
                }

还要在 Manifest.xml 中提及这些权限..

    <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
    <uses-permission android:name="android.permission.SET_WALLPAPER" />

这是截图..

要重置屏幕的适合壁纸,请将图像路径存储在共享首选项中并使用 Boot Completed Receiver 然后重置屏幕上的相同壁纸....

广播接收器是..

import java.io.IOException;

import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;

public class BootReceiver extends BroadcastReceiver {
private static final String TAG="BootReceiver";

@Override public void onReceive(Context context,Intent intent){
    try{
            DisplayMetrics metrics = new DisplayMetrics(); 
            WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            windowManager.getDefaultDisplay().getMetrics(metrics);
            int height = metrics.heightPixels; 
            int width = metrics.widthPixels;
            Bitmap tempbitMap = BitmapFactory.decodeResource(context.getResources(), R.drawable.img);
            Bitmap bitmap = Bitmap.createScaledBitmap(tempbitMap,width,height, true);
            WallpaperManager wallpaperManager = WallpaperManager.getInstance(context); 
            wallpaperManager.setWallpaperOffsetSteps(1, 1);
            wallpaperManager.suggestDesiredDimensions(width, height);
            try {
              wallpaperManager.setBitmap(bitmap);
              } catch (IOException e) {
              e.printStackTrace();
            }
    }catch(Exception e){
        Log.e(TAG,e.toString());
    }
}
}

在 Manifest.xml 中添加这些行之后

       <receiver
            android:name=".BootReceiver"
            android:enabled="true"
            android:exported="true"
            android:label="BootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" >
                </action>
            </intent-filter>
        </receiver>

【讨论】:

  • Hii @John R 如果您对我的代码感到满意,请接受我的回答。否则请告诉我...
  • 你这样做太晚了。赏金已过期.. :( 我失去了 100 名声望 s.@John R
  • 我在您的代码中发现了一个困难,如果我重新启动我的设备或玩游戏后回到主屏幕,壁纸尺寸会增加。如何阻止这种情况?
  • 您回答了自己的问题。为什么我将该赏金授予该用户。因为你和他的答案是一样的,他在你之前回答了。
  • @Pankaj Sharma 我也遇到过这个问题,但是这段代码对我不起作用请指导我stackoverflow.com/questions/32201161/…
【解决方案2】:

试试这个代码

Bitmap bmap2 =BitmapFactory.decodeStream(getResources().openRawResource(mThumb[position]));
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = metrics.heightPixels; 
    int width = metrics.widthPixels;
    Bitmap bitmap = Bitmap.createScaledBitmap(bmap2, width, height, true); 
    WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
    wallpaperManager.setWallpaperOffsetSteps(1, 1);
    wallpaperManager.suggestDesiredDimensions(width, height);
    try {
      wallpaperManager.setBitmap(bitmap);
      } catch (IOException e) {
      e.printStackTrace();
    }

【讨论】:

  • 你遇到了什么问题
  • 重启设备或玩游戏后回到主屏幕。图片缩放。
  • 设备重启可以通过android大师的回答来处理,但是设备方向的改变会和你玩游戏后得到的效果一样。您是否有任何应用程序执行您需要的相同任务?
  • AndroidGuru 的代码在设备重启时不起作用。而且我已经固定了它的纵向方向。
  • @JohnR 我认为我们错过了有关方法SuggestDesiredDimensions()的一些非常重要的东西:“仅供当前家庭应用程序使用,指定它想要使用的壁纸大小。这允许这样应用程序有一个比物理屏幕更大的虚拟壁纸,与其工作区的大小相匹配。这是为了让主屏幕告诉他们想要什么尺寸的壁纸。没有其他人应该这样称呼它!当然不是其他非改变壁纸的主屏幕应用程序。”参考方法suggestDesiredDimensions()的描述
【解决方案3】:

如果您有图片网址,请使用:

WallpaperManager wpm = WallpaperManager.getInstance(context);
InputStream ins = new URL("absolute/path/of/image").openStream();
wpm.setStream(ins);

如果您有图像 URI,则使用

WallpaperManager wpm = WallpaperManager.getInstance(context);
wpm.setResource(Uri.of.image);

在您的清单文件中:

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

别忘了将此代码放在AsyncTask

【讨论】:

    【解决方案4】:

    试试这个代码:

    public void changeWallpaper(String path) {
            FileInputStream is;
            BufferedInputStream bis;
            WallpaperManager wallpaperManager;
            Drawable wallpaperDrawable;
            File sdcard = Environment.getExternalStorageDirectory();
            try {
                is = new FileInputStream(new File(path));
                bis = new BufferedInputStream(is);
                Bitmap bitmap = BitmapFactory.decodeStream(bis);
                Bitmap useThisBitmap = Bitmap.createBitmap(bitmap);
                wallpaperManager = WallpaperManager.getInstance(getActivity());
                wallpaperDrawable = wallpaperManager.getDrawable();
                wallpaperManager.setBitmap(useThisBitmap);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    在这个例子中,我使用了来自我的device SD 卡片的图片...

    这对我来说非常有用..

    【讨论】:

    • 我有可绘制的图像,如何做到这一点?
    【解决方案5】:

    注意:可能不适合你。

    你需要这个:

    WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
                 try {
                  wallpaperManager.setBitmap(bitmap);
    
                  wallpaperManager.suggestDesiredDimensions(width, height);
                    Toast.makeText(this, "Wallpaper Set", Toast.LENGTH_SHORT).show();
                 } catch (IOException e) {
                  e.printStackTrace();
                 }
    

    enter link description here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多