Страница 1 из 1

Как поменять background рабочего стола в телефоне

Добавлено: 28 янв 2012, 12:11
alogin
Некогда ранее задавал вопрос про сабж темы, на что ответили что нужно сделать отдельную тему в этом топике, но до того как я увидел ответ, уже в гугле нашел что как сделать, и вот решил поделиться со страждующими и написать небольшой мануал с дополнениями, а взрослые дядьки пусть посмотрят и может оптимизируют код.

В общем делаем main.xml с двумя кнопками

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:onClick="onClick" >

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <Button
            android:id="@+id/btn_l"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:text="BackGroun_Layer"
             />
        <Button
            android:id="@+id/btn_g"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="BackGround_Global"
            />
    </RelativeLayout>
</LinearLayout>
[/size]

Одну кнопку мы делаем для того чтобы поменять фон рабочего стола в самой программе, вторую делаем для того чтобы поменять фон рабочего стола в самом телефоне. Затем в папке /res мы создаем папку drawable, должно получиться /res/drawable. И в эту папку закидываем картинки которые будем использовать для рабочего стола

пишем MainActivity.java

Код: Выделить всё

package app.fix.test_imagechange;

import java.io.IOException;

import android.app.Activity;
import android.app.WallpaperManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener {
	
        // описываем кнопки
	Button btn_l, btn_g;	
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // Находим их
        btn_l = (Button) findViewById(R.id.btn_l);
        btn_g = (Button) findViewById(R.id.btn_g);
       
        // Назначаем им действие
        btn_l.setOnClickListener(this);
        btn_g.setOnClickListener(this);
    }

        // затем следует сама процедура onClick
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()){
                // Если нажата кнопка для смены background'a в layout'e
		case R.id.btn_l:
                        // wallpaper1 это картинка которая хранится в /res/drawable
			v.setBackgroundResource(R.drawable.wallpaper1);
			break;
                // Если нажата кнопка для смены background'a в самом телефоне
		case R.id.btn_g:
                        // Здесь мы видимо используем стандартный android'овский wallpapermanager для работы с изображениями
                        // Здесь бы рассказать поточнее про него, кто что знает ))
			WallpaperManager wm = WallpaperManager.getInstance(this);
			try {
				wm.setResource(R.drawable.wallpaper3);
			} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
}
[/size]

Ну вот и все, осталось только назначить соответствующие разрешения в androidmanifest.xml
В него пишем либо код

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.fix.test_imagechange"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
[/size]

Либо делаем руками во вкладке Permissions
Add -> Uses Permision -> в name пишем android.permission.SET_WALLPAPER (либо выбираем из списка)

Запускаем и смотрим что получилось

Изображение Изображение Изображение

Возникло несколько вопросов по теме

1. Как сделать так чтобы по нажатию на кнопку btn_l ( смена background'a в самой программе) не исчезала кнопка которая меняет background. Я так понимаю что оно делает новые View и в нем уже картинку меняет чтоли :)

2. Как сделать так чтобы по нажатию на кнопку btn_g ( смена background'a в самом телефоне) оно пыталось подогнать размер как в стандартной галерее
Изображение
Я так понимаю что надо использовать Intent Filter от галереи для масштабирования картинки или что то подобное. Если кто подскажет буду очень благодарен.

З.ы. Долго отсутствовал, теперь вернулся, буду нет-нет задавать вопросы, заранее спс за подсказки и за уроки.

Re: Как поменять background рабочего стола в телефоне

Добавлено: 28 янв 2012, 23:51
damager82
alogin писал(а):Как сделать так чтобы по нажатию на кнопку btn_l ( смена background'a в самой программе) не исчезала кнопка которая меняет background. Я так понимаю что оно делает новые View и в нем уже картинку меняет чтоли :)
Кнопка исчезает потому, что код

Код: Выделить всё

v.setBackgroundResource(R.drawable.wallpaper1);
ставит фоновую картинку для v. А v - это кнопка. Правда непонятно, почему он на весь экран ее растягивает.

Надо находить корневой LinearLayout и для него метод setBackgroundResource вызывать.

Re: Как поменять background рабочего стола в телефоне

Добавлено: 29 янв 2012, 12:07
alogin
Надо будет потестить, что то подобное я и предполагал, ток почему интересно он растягивает картинку на весь экран а не на кнопку (как элемент этого экрана).

Второй вопрос остается открытым, кое чего нарыл в гугле, есть такой код

Код: Выделить всё

private void doTakePhotoAction() {
    // http://2009.hfoss.org/Tutorial:Camera_and_Gallery_Demo
    // http://stackoverflow.com/questions/1050297/how-to-get-the-url-of-the-captured-image
    // http://www.damonkohler.com/2009/02/android-recipes.html
    // http://www.firstclown.us/tag/android/
    // The one I used to get everything working: http://groups.google.com/group/android-developers/msg/2ab62c12ee99ba30 

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    //Wysie_Soh: Create path for temp file
    mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
                        "tmp_contact_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));

    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);

    try {
        intent.putExtra("return-data", true);
        startActivityForResult(intent, PICK_FROM_CAMERA);
    } catch (ActivityNotFoundException e) {
        //Do nothing for now
    }
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) {
        return;
    }

    switch (requestCode) {

    case CROP_FROM_CAMERA: {
        //Wysie_Soh: After a picture is taken, it will go to PICK_FROM_CAMERA, which will then come here
        //after the image is cropped.

        final Bundle extras = data.getExtras();

        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");

            mPhoto = photo;
            mPhotoChanged = true;
            mPhotoImageView.setImageBitmap(photo);
            setPhotoPresent(true);
        }

        //Wysie_Soh: Delete the temporary file                        
        File f = new File(mImageCaptureUri.getPath());            
        if (f.exists()) {
            f.delete();
        }

        InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        mgr.showSoftInput(mPhotoImageView, InputMethodManager.SHOW_IMPLICIT);

        break;
    }

    case PICK_FROM_CAMERA: {
        //Wysie_Soh: After an image is taken and saved to the location of mImageCaptureUri, come here
        //and load the crop editor, with the necessary parameters (96x96, 1:1 ratio)

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setClassName("com.android.camera", "com.android.camera.CropImage");

        intent.setData(mImageCaptureUri);
        intent.putExtra("outputX", 96);
        intent.putExtra("outputY", 96);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);            
        startActivityForResult(intent, CROP_FROM_CAMERA);

        break;

    }
    }
}
Разбирая код, сначала мы делаем Intent с каким то акшеном MediaStore.ACTION_IMAGE_CAPTURE, который берет видимо для обработки картинку

Затем делаем путь к файлу где будет храниться темповский файл, пока с ним работаем, с этим все понятно

а вот дальше вообще барада, нифига не понятно, какая то функция, которая возвращает результат, в ней выбор CROP_FROM_CAMERA ( нипонятно почему с камеры берется, или может это стандратная операция)
Идет проверка на существование темповского файла и удалении его при совпадении

Этот код

Код: Выделить всё

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        mgr.showSoftInput(mPhotoImageView, InputMethodManager.SHOW_IMPLICIT);
Вообще не понятен

Затем идет следующий выбор
PICK_FROM_CAMERA
где самые интересные параметры, для меня по крайней мере, вот это

Код: Выделить всё

intent.setData(mImageCaptureUri);
        intent.putExtra("outputX", 96); // видимо указываются ширина и высота вырезаемой картинки
        intent.putExtra("outputY", 96);
        intent.putExtra("aspectX", 1); // это видимо соотношение сторон
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true); // режим растяжения включен
        intent.putExtra("return-data", true);  // что то возвращает, нипонятно что ?          
        startActivityForResult(intent, CROP_FROM_CAMERA);
// и стартует активити с возвращением результата в интент, используя crop_from_camera

Что це и с чем его едят ???, если по русски кто нибудь сможет помочь разобрать код то буду очень благодарен

В общем код есть и код даже рабочий, но блин нифига не понятно, чтобы понять и не задавать глупых вопросов, о гуру, помогите разобраться