0

I'm trying to make an app with a listview that contains image preview files and when one of the images in the listview is clicked it is set as the device's wallpaper. My listview XML file looks like this:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TableRow>

        <ImageView
            android:id="@+id/img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:contentDescription="@string/wallpaper_preview" />

    </TableRow>

    <TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="10dp"
        android:gravity="center"/>
</TableLayout>

The Java file for the listview looks like this:

package biz.bigtooth.naturewallpapers;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomList extends ArrayAdapter<String>{

    private final Activity context;
    private final String[] web;
    private final Integer[] imageId;
    public CustomList(Activity context,
                      String[] web, Integer[] imageId) {
        super(context, R.layout.list_single, web);
        this.context = context;
        this.web = web;
        this.imageId = imageId;

    }
    @Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView= inflater.inflate(R.layout.list_single, null, true);
        TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);

        ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
        txtTitle.setText(web[position]);

        imageView.setImageResource(imageId[position]);
        return rowView;
    }
}

And my main activity java file looks like this:

package biz.bigtooth.naturewallpapers;

import android.app.WallpaperManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.InterstitialAd;
import com.google.android.gms.ads.MobileAds;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    InterstitialAd mInterstitialAd;

    ListView list;
    String[] web = {
            "Leaves",
            "Lilacs",
            "Dandy Lions",
            "Twigs",
            "Holly",
            "White Flowers",
            "Cave Pool"
    } ;
    Integer[] imageId = {
            R.drawable.leaves_preview,
            R.drawable.lilac_preview,
            R.drawable.dandy_lions_preview,
            R.drawable.twigs_preview,
            R.drawable.holly_preview,
            R.drawable.white_flowers_preview,
            R.drawable.cave_pool_preview

    };

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

        MobileAds.initialize(getApplicationContext(), "ca-app-pub-5164171001589422/5381023392");

        AdView mAdView = (AdView) findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);

        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId("ca-app-pub-5164171001589422/5381023392");

        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdClosed() {
                requestNewInterstitial();

            }
        });

        requestNewInterstitial();

        CustomList adapter = new
                CustomList(MainActivity.this, web, imageId);
        list=(ListView)findViewById(R.id.list);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    final int position, long id) {
            }
            String main = list.getSelectedItem().toString();
            //where i need help
        });
    }

    private void requestNewInterstitial() {
        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice("5C6759521D465119182182A234FF5CE3")
                .build();

        mInterstitialAd.loadAd(adRequest);
    }
}

If anyone could get me on the right track I would be very appreciative.

I DO NOT want it to apply one specific wallpaper, I want the app to recognize the image that's been clicked and apply that exact one.

  • Possible duplicate of [Programmatically set android phone's background](http://stackoverflow.com/questions/20053919/programmatically-set-android-phones-background) – Janki Gadhiya Jun 25 '16 at 05:08

2 Answers2

0

you can use this code. you should use image id in

myWallpaperManager.setResource(R.drawable.leaves_preview)

use this code in public void onItemClick(AdapterView<?> parent, View view,final int position, long id)

    WallpaperManager myWallpaperManager 
    = WallpaperManager.getInstance(getApplicationContext());
    try {
        myWallpaperManager.setResource(R.drawable.leaves_preview);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Need to set permission in Manifest:

<uses-permission android:name="android.permission.SET_WALLPAPER"/>
yasser karimi
  • 329
  • 3
  • 13
  • The only issue with your code is that it doesn't adjust for the other images. I want it to be able to figure out which image was clicked and for it to dynamically change the picture that gets set as wallpaper. – BigTooth Apps Jun 25 '16 at 05:31
0

You need set the permission into your AndroidManifest.xml file.

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

You can set the background with following :

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
    private void setWallpaper(int resId) {
        WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
        try {
            myWallpaperManager.setResource(resId);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_SET_WALLPAPER) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                btn.performClick();
            } else {
                Toast.makeText(getApplicationContext(), "Require permission to set Wallpaper. " +
                        "Please Allow.", Toast.LENGTH_SHORT).show();
            }
        }
    }

add following code into ListView.setOnItemClickListener() as below :

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    final int position, long id) {
                if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.SET_WALLPAPER) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.SET_WALLPAPER},
                            PERMISSION_SET_WALLPAPER);
                } else {
                    setWallpaper(R.drawable.splash_bg);
                }
            }
        });
Rohit Suthar
  • 2,635
  • 1
  • 22
  • 27