Обои неправильно помещаются на экране устройства

У меня есть один набор изображений в одной папке с возможностью рисования. У меня есть одна кнопка, чтобы установить изображение в качестве обоев на экране устройства. Но когда я устанавливаю это изображение в качестве обоев, оно либо масштабируется, либо обрезается. Я хочу, чтобы изображение соответствовало размеру экрана. Я видел много ссылок на 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" />

person John R    schedule 31.03.2014    source источник
comment
Я также столкнулся с той же проблемой масштабирования обоев. Какое решение вы найдете для этого, пожалуйста, помогите мне решить эту [проблему] (stackoverflow.com/questions/32201161/) ....   -  person Garg's    schedule 25.08.2015


Ответы (5)


Привет. Это работает с нарисованным изображением, которое я проверил.

                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>
person PankajSharma    schedule 08.04.2014
comment
Привет @John R, если вы удовлетворены моим кодом, примите мой ответ ... в противном случае дайте мне знать, пожалуйста ... - person PankajSharma; 09.04.2014
comment
Вы сделали это так поздно. Срок действия награды истек.. :( Я теряю 100 очков репутации s.@John R - person PankajSharma; 10.04.2014
comment
Я обнаружил одну трудность в вашем коде, если я перезагружу свое устройство или после игры вернусь на главный экран, размер обоев увеличится. Как остановить это? - person John R; 14.04.2014
comment
увеличение в смысле??размер обоев стал увеличиваться или еще что? - person PankajSharma; 14.04.2014
comment
И я думаю, что и код, который вы дали здесь, и мой код одинаковы, и оба работают одинаково. - person PankajSharma; 14.04.2014
comment
Есть ли способ остановить его масштабирование? Я хочу постоянный вид, как на изображении выше. - person John R; 14.04.2014
comment
Вы ответили на свой вопрос. почему я присудил эту награду этому пользователю. Потому что ваш и его ответ одинаковы, и он ответил раньше вас. - person John R; 14.04.2014
comment
Пожалуйста, не возражайте. Этот сайт для помощи другим. Это более ценная вещь, чем баллы, и я думаю, что вы заработали 95 баллов за этот ответ. Теперь проверьте его на 105 больше, чем щедрость. - person John R; 14.04.2014
comment
спасибо. все в порядке. это не имеет значения. вы можете присоединиться к чату Android-кодеров, я там могу говорить лучше. - person PankajSharma; 14.04.2014
comment
пожалуйста, скажите мне решение. - person John R; 14.04.2014
comment
но как насчет другой проблемы, если я играю в игру, а затем возвращаюсь на главный экран, в этом случае размер изображения также увеличивается. - person John R; 14.04.2014
comment
давайте продолжим обсуждение в чате - person John R; 16.04.2014
comment
@Pankaj Sharma Я тоже сталкивался с этой проблемой, но этот код не работает для меня, пожалуйста, помогите мне stackoverflow.com/questions/32201161/ - person Garg's; 25.08.2015

попробуйте этот код

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();
    }
person RQube    schedule 08.04.2014
comment
с какой проблемой вы столкнулись - person RQube; 16.04.2014
comment
При перезагрузке устройства или после игры, когда я возвращаюсь на главный экран. Изображение получить масштаб. - person John R; 16.04.2014
comment
перезапуск устройства может быть обработан ответом гуру Android, но изменение ориентации устройства будет иметь тот же эффект, что и после игры. Есть ли у вас какое-либо приложение, выполняющее ту же задачу, что вам требуется? - person RQube; 16.04.2014
comment
код AndroidGuru не работает при перезагрузке устройства. И я исправил ориентацию его портрета. - person John R; 18.04.2014
comment
@JohnR Я думаю, что мы упустили что-то очень важное в методе offerDesiredDimensions() : для использования только текущим домашним приложением, чтобы указать размер обоев, которые оно хотело бы использовать. Это позволяет таким приложениям иметь виртуальные обои, которые больше, чем физический экран, в соответствии с размером их рабочего пространства. Это для домашних экранов, чтобы сказать, какой размер обоев они хотели бы. ‹b›Никто больше не должен звонить сюда! Конечно, не другие приложения, не относящиеся к домашнему экрану, которые меняют обои. ‹/b› обратитесь к описанию метода sentDesiredDimensions () - person RQube; 21.04.2014
comment
Внимательно прочитайте описание метода offerDesiredDimensions() здесь developer.android.com/reference/android/app/ - person RQube; 30.04.2014
comment
Итак, какое решение для этого? - person John R; 01.05.2014

Если у вас есть URL-адрес изображения, используйте:

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.

person Harshit Rathi    schedule 09.04.2014

Попробуйте этот код:

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...

Это отлично сработало для меня ..

person Lokesh    schedule 02.04.2014
comment
У меня есть изображения в drawable, так как это сделать? - person John R; 03.04.2014

уведомление: возможно, не работает для вас.

ты нуждаешься в этом:

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();
             }

введите здесь описание ссылки

person lingyfh    schedule 06.05.2015