Android 访问相册切换背景

前言

Gilde框架用起来爽的不行,啊,pong友们可以百度了解、XIO习一下
初识图片加载框架——Glide的简单用法

前端代码

1.activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main2_bg"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    
		<Button
            android:id="@+id/btn_wallpaper"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="背景切换" />
</LinearLaout>

2.创建一个activity_wallpaper.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/image_choose"
        android:layout_width="100dp"
        android:layout_height="80dp"
        android:background="#C97CCF"/>

    <Button
        android:id="@+id/btn_sure"
        android:layout_width="80dp"
        android:layout_height="30dp"
        android:layout_marginTop="10dp"
        android:textColor="@color/white"
        android:background="#3F8798"
        android:text="确定"
        android:textSize="15dp"
        android:textStyle="bold" />
</LinearLayout>
后端代码

1.在build.gradle里导入Glide框架(可忽略,我写了两种方法)
Glide

	//Glide框架
    implementation 'com.github.bumptech.glide:glide:3.7.0'

2.创建一个WallpaperActivity.java

package com.example.firstproject;

import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.bumptech.glide.Glide;
import com.example.firstproject.util.SharedPreferencesUtil;

/**
 * app背景切换界面
 */
public class WallpaperActivity extends AppCompatActivity implements View.OnClickListener {

    private ImageView image_choose;
    private Button btn_sure;
    public static final int RC_CHOOSE_PHOTO = 2;
    private Uri uri;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wallpaper);
        init();
    }

    /**
     * 绑定UI组件
     */
    public void init() {
        //
        image_choose = (ImageView) findViewById(R.id.image_choose);
        image_choose.setOnClickListener(this);

        btn_sure = (Button) findViewById(R.id.btn_sure);
        btn_sure.setOnClickListener(this);
    }

    /**
     * 点击事件
     *
     * @param view 切换背景界面
     */
    @Override
    public void onClick(View view) {

        switch (view.getId()) {

            case R.id.image_choose:
            	//访问相册
                Intent intentToPickPic = new Intent(Intent.ACTION_PICK, null);
                intentToPickPic.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(intentToPickPic, RC_CHOOSE_PHOTO);
                break;
            case R.id.btn_sure:
            	//使用SharedPreferences存入选取图片的路径
				SharedPreferences sp = this.getSharedPreferences("Key", Context.MODE_PRIVATE);
                sp.edit().putString("wallPaper", String.valueOf(uri)).apply();     //存入名字和内容
                
                //如果根据我的上一篇文章有SharedPreferencesUtil类的话,可以使用setValue方法存值
                //SharedPreferencesUtil.setValue(this, "wallPaper", String.valueOf(uri));
                
                finish();//结束当前activity
                break;

        }
    }

    /**
     * 返回选取图片的数据
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case RC_CHOOSE_PHOTO:
                try {
                    uri = data.getData();
                    //android原生
                    //image_choose.setImageURI(uri);

                    //使用Glide框架
                    Glide.with(this)
                            .load(uri)				//	图片的路径
                            .into(image_choose);	//  填充至所绑定的Image组件
                } catch (Exception e) {
                	e.printStackTrace();
                }
                break;
        }
    }
}

3.不要忘记在AndroidMainFest.xml注册你新建的WallpaperActivity.java
AndroidMainFest

<activity android:name=".WallpaperActivity"/>

4.MainActivity.java

package com.example.firstproject;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.ViewTarget;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

	private LinearLayout background;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

	//UI绑定
	public void init(){
		//背景切换
        Button btn_wallpaper = (Button) findViewById(R.id.btn_wallpaper);
        btn_wallpaper.setOnClickListener(this);

        //main背景
        background = (LinearLayout) findViewById(R.id.main2_bg);
	}

	/**
     * 点击事件
     * @param view main页面
     */
    @Override
    public void onClick(View view) {
        Intent intent = new Intent();
        switch (view.getId()) {
        case R.id.btn_wallpaper:
        		//也可以用Intent intent1 = new Intent(this,WallpaperActivity.class);
                intent.setClassName(this, "com.example.firstproject.WallpaperActivity");	//你对应的WallpaperActivity位置

                //使用startActivityForResult进行跳转,从对应的WallpaperActivity返回时,会调用onActivityResult方法
                startActivityForResult(intent, 0);
                break;
        }
    }

/**
     * 回调方法
     *
     * @param requestCode 传过去的值
     * @param resultCode  传回来的值
     * @param data        从那个activity传过来的
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        /**
         * 方法一
         */
        String wallPaperUrl = SharedPreferencesUtil.getValue(this, "wallPaper");
        //判断之前是否有更换背景,有则显示
        if (!"".equals(wallPaperUrl) && wallPaperUrl != null) {

            wallPaper(Uri.parse(wallPaperUrl));
        }

        /**
         * 方法二
         */
//        SharedPreferences sp = this.getSharedPreferences("Key", Context.MODE_PRIVATE);
//        String wallPaperUrl = sp.getString("wallPaper","");     //存入名字和内容
//        if (!"".equals(wallPaperUrl) && wallPaperUrl!= null) {
//
//            wallPaper(Uri.parse(wallPaperUrl));
//        }

        Log.v("requestCode", String.valueOf(requestCode));

        Log.v("resultCode", String.valueOf(resultCode));
    }
	

    /**
     * 自定义壁纸
     */
    public void wallPaper(Uri uri) {

        /**
         * 方法一:android原生
         */
//        String[] filePathColumn = {MediaStore.Images.Media.DATA};
//        Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
//        cursor.moveToFirst();
//        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
//        String path = cursor.getString(columnIndex);
//        Bitmap bitmap = BitmapFactory.decodeFile(path);
//        Drawable drawable = new BitmapDrawable(bitmap);
//        background.setBackground(drawable);

        /**
         * 方法二:使用Glide框架
         */
        Glide.with(this).load(uri).into(new ViewTarget<View, GlideDrawable>(background) {
            //括号里为需要加载的控件
            @Override
            public void onResourceReady(GlideDrawable resource,
                                        GlideAnimation<? super GlideDrawable> glideAnimation) {
                this.view.setBackground(resource.getCurrent());
            }
        });
    }
}

5.最后在AndroidMainFest.xml加上以下代码实现对相册的权限申请

权限申请

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

注:android10以及android10以上版本加了这个,访问相册还是有可能会报错,提示权限问题,作者是彩笔,解决不了(有没有一种可能,这不是一回事,不管了,我也不知道,反正说是权限问题的可以看看,有其他报错可以告诉我)
可以参照这个链接解决:解决Android10版本以上外部存储权限的方案

小声BB:作者用android11的机器试了一下,还是可以访问,有丶怪。

运行结果

背景切换
大概就是这样了,有什么问题可以回复我,我会的话会回复的(我不会也没有办法嘛)
歇了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值