壁纸不适合设备屏幕

Posted

技术标签:

【中文标题】壁纸不适合设备屏幕【英文标题】: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" />

【问题讨论】:

我也面临同样的缩放壁纸问题。你找到什么解决方案请帮我解决这个[问题] (***.com/questions/32201161/…) .... 【参考方案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 我也遇到过这个问题,但是这段代码对我不起作用请指导我***.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

【讨论】:

以上是关于壁纸不适合设备屏幕的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Swift 5 和 IOS 12 中以编程方式更改 iOS 屏幕壁纸吗

windows聚焦锁屏壁纸不显示

android如何通过代码设置锁屏壁纸

仅设置 Android 主屏幕壁纸

android怎么把一个小图片布满整个屏幕

安卓手机设置壁纸为啥不清晰