Android(Java)如何获取主屏幕背景图片并设置为Activity背景
Android 获取系统主屏幕壁纸并设置为Activity背景的实现方法
1. 清单文件声明权限
在AndroidManifest.xml中添加对应权限:
<!-- Android 13及以上版本 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- Android 12及以下版本 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
2. 动态申请权限
Android 6.0(API 23)及以上版本需要动态申请存储相关权限,在目标Activity中添加如下逻辑:
// 权限请求码 private static final int PERMISSION_REQUEST_CODE = 1001; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 检查权限 if (ContextCompat.checkSelfPermission(this, Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 申请权限 ActivityCompat.requestPermissions(this, Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU ? new String[]{Manifest.permission.READ_MEDIA_IMAGES} : new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } else { // 已有权限,直接获取壁纸 loadWallpaperToBackground(); } } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { loadWallpaperToBackground(); } } }
3. 获取系统壁纸并设置为Activity背景
private void loadWallpaperToBackground() { WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); // 获取壁纸Drawable Drawable wallpaperDrawable = wallpaperManager.getDrawable(); // 给Activity根布局设置背景 View rootView = findViewById(android.R.id.content); rootView.setBackground(wallpaperDrawable); }
注意事项
- 如果用户设置的是动态壁纸,
getDrawable()返回的是动态Drawable实例,设置为背景后会跟随系统动态壁纸同步刷新;如果只需要静态快照,可以替换为wallpaperManager.peekDrawable()获取静态壁纸。- 部分定制ROM对壁纸获取做了额外权限限制,若出现获取失败的情况,需要适配对应ROM的特殊权限申请逻辑。
- 壁纸分辨率普遍较高,建议在子线程中做裁剪、缩放处理后再设置到UI,避免主线程阻塞引发ANR。
内容的提问来源于stack exchange,提问作者mSafdel
相关产品推荐
相关产品推荐

