360手机有一个很赞的应用,没有界面,点击一下图标换一张壁纸,其他手机都没有看到这个功能。
vivo倒是有亮屏换锁屏壁纸。
1.无界面应用
https://blog.51cto.com/u_16213305/8503774
AndroidManifest.xml
主题改为不显示
<activity android:name=".MainActivity"
android:theme="@android:style/Theme.NoDisplay">
安卓高版本报错:did not call finish() prior to onResume() completing
改成透明主题
<activity android:name=".MainActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
2.壁纸API
Bing每日壁纸: http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
3.下载壁纸
Android HttpURLConnection下载网络图片设置系统壁纸_Android_脚本之家
URL httpUrl = new URL(imgUrl);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
InputStream IS = conn.getInputStream();
4.数据转换为Bitmap
Bitmap bitmap = BitmapFactory.decodeStream(IS);
5.设置壁纸
10.9 WallpaperManager(壁纸管理器) · W3School 菜鸟笔记 Android 基础入门教程 · 看云
https://www.cnblogs.com/android-deli/p/10116723.html
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
WallpaperManager WM = WallpaperManager.getInstance(this);
WM.setBitmap(bitmap);
问题
1.Cleartext HTTP traffic to xxx not permitted
AndroidManifest.xml
<application
....
android:usesCleartextTraffic="true">
2.NetworkOnMainThreadException
网络进程要写在 new Thread 里。
3.锁屏和桌面同时改变
好像高版本安卓底层代码是这样设置的,而且锁屏亮屏自动切换壁纸会被关掉。
主要代码
MainActivity.java
package com.hty.wallpaper;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.WallpaperManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import org.json.JSONObject;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new Thread(api).start();
}
Thread api = new Thread() {
@Override
public void run() {
String surl = "http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1";
String s = Utils.getURLResponse(surl);
try {
JSONObject JO = new JSONObject(s);
surl = "http://www.bing.com" + JO.getJSONArray("images").getJSONObject(0).getString("url");
Log.e(Thread.currentThread().getStackTrace()[2] + "", surl);
Bitmap bitmap = Utils.getBitmap(surl);
Message message = new Message();
message.what = 0;
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
message.setData(bundle);
handler.sendMessage(message);
} catch (Exception e) {
Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());
String sm = e.toString();
Message message = new Message();
message.what = 1;
message.obj = sm;
handler.sendMessage(message);
}
}
};
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
Bitmap bitmap = msg.getData().getParcelable("bitmap");
WallpaperManager WM = WallpaperManager.getInstance(MainActivity.this);
try {
WM.setBitmap(bitmap);
} catch (Exception e) {
Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());
}
finish();
break;
case 1:
String s = (String) msg.obj;
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
break;
}
}
};
}
Utils.java
package com.hty.wallpaper;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
public class Utils {
static String getURLResponse(String surl) {
HttpURLConnection connection = null;
InputStream IS = null;
String resultData = "";
try {
URL url = new URL(surl);
connection = (HttpURLConnection) url.openConnection();
//connection.setDoInput(true);
//connection.setUseCaches(false);
connection.setRequestMethod("GET");
IS = connection.getInputStream();
InputStreamReader ISR = new InputStreamReader(IS, StandardCharsets.UTF_8);
BufferedReader BR = new BufferedReader(ISR);
String inputLine;
while ((inputLine = BR.readLine()) != null) {
resultData += inputLine;
}
} catch (Exception e) {
Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());
} finally {
if (IS != null) {
try {
IS.close();
} catch (Exception e) {
Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());
}
}
if (connection != null) {
connection.disconnect();
}
}
return resultData;
}
//https://blog.csdn.net/wu8022/article/details/10310527
static Bitmap getBitmap(String imageUrl) {
Bitmap bitmap = null;
try {
URL url = new URL(imageUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream IS = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(IS);
} catch (Exception e) {
Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());
}
return bitmap;
}
}