Thursday, March 3, 2016

Load photo and set Wallpaper


Example to open photo with Intent of ACTION_OPEN_DOCUMENT/ACTION_GET_CONTENT, then set as Wallpaper with WallpaperManager.


MainActivity.java
package com.blogspot.android_er.androidwallpaper;

import android.app.Activity;
import android.app.WallpaperManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.FileNotFoundException;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    ImageView imageWallpaper;
    Button btnLoadWallpaper, btnDisplayWallpaper;

    private static final int RQS_OPEN_IMAGE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageWallpaper = (ImageView)findViewById(R.id.image);

        btnDisplayWallpaper = (Button)findViewById(R.id.displaywp);
        btnDisplayWallpaper.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                displayWallpaper();
            }
        });

        btnLoadWallpaper = (Button)findViewById(R.id.loadwp);
        btnLoadWallpaper.setOnClickListener(btnLoadWallpaperOnClickListener);
        displayWallpaper();

    }

    View.OnClickListener btnLoadWallpaperOnClickListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent();

            if (Build.VERSION.SDK_INT >=
                    Build.VERSION_CODES.KITKAT) {
                intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
            } else {
                intent.setAction(Intent.ACTION_GET_CONTENT);
            }

            intent.addCategory(Intent.CATEGORY_OPENABLE);

            // set MIME type for image
            intent.setType("image/*");

            startActivityForResult(intent, RQS_OPEN_IMAGE);
        }
    };

    private void displayWallpaper(){
        WallpaperManager myWallpaperManager =
                WallpaperManager.getInstance(getApplicationContext());
        Drawable drawableWallpaper = myWallpaperManager.getDrawable();
        imageWallpaper.setImageDrawable(drawableWallpaper);

        Toast.makeText(this,
                drawableWallpaper.getMinimumWidth() + " x " + drawableWallpaper.getMinimumHeight()
                        + "\n" +
                        drawableWallpaper.getIntrinsicWidth() + " x " + drawableWallpaper.getIntrinsicHeight(),
                Toast.LENGTH_LONG).show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == RQS_OPEN_IMAGE) {
                Uri dataUri = data.getData();
                Uri wallpaperUri = dataUri;
                Toast.makeText(this, wallpaperUri.toString(), Toast.LENGTH_LONG).show();

                Bitmap newOriginalBM= loadBitmap(dataUri);;
                reloadWallpaper(newOriginalBM);
            }
        }
    }

    private Bitmap loadBitmap(Uri src) {

        Bitmap bm = null;

        try {
            bm = BitmapFactory.decodeStream(
                    getBaseContext().getContentResolver().openInputStream(src));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        return bm;
    }

    private void reloadWallpaper(Bitmap bm){
        if(bm != null){
            WallpaperManager myWallpaperManager =
                    WallpaperManager.getInstance(getApplicationContext());

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if(myWallpaperManager.isWallpaperSupported()){
                    try {
                        myWallpaperManager.setBitmap(bm);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }else{
                    Toast.makeText(MainActivity.this,
                            "isWallpaperSupported() NOT SUPPORTED",
                            Toast.LENGTH_LONG).show();
                }
            }else{
                try {
                    myWallpaperManager.setBitmap(bm);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }else{
            Toast.makeText(MainActivity.this, "bm == null", Toast.LENGTH_LONG).show();
        }
    }
}


activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    tools:context="com.blogspot.android_er.androidwallpaper.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="http://android-er.blogspot.com/"
        android:textStyle="bold" />
    <Button
        android:id="@+id/displaywp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Display Wallpaper"/>
    <Button
        android:id="@+id/loadwp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Load Wallpaper"/>
    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>


uses-permission of "android.permission.SET_WALLPAPER" is needed in AndroidManifest.xml.

download filesDownload the files (Android Studio Format) .

Next:
Restore default build-in wallpaper