我有一个BroadcastReceiver并声明它是这样的:
<receiver
android:name="com.services.Receiver"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="999" >
<action android:name="android.intent.action.WALLPAPER_CHANGED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
接收者是:
@Override
public void onReceive(final Context context, final Intent intent)
{
change_wallpepar.myPrefs = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
Log.d("MAYUR", "<< wallpepar changed >>");
if (change_wallpepar.myPrefs.getLong("temp_for_change", 1) == 0)
{
context.stopService(new Intent(context, change_wallpepar.class));
}
else
{
SharedPreferences.Editor e = change_wallpepar.myPrefs.edit();
e.putLong("temp_for_change", 0);
e.commit();
}
}
}, 4000);
}
Run Code Online (Sandbox Code Playgroud)
当我在这里更改壁纸时,它应该被调用一次.它实际上是按照我的期望工作了一段时间,在几分钟后它会调用onreceive()多次(10-18)次,即使壁纸的更改已完成一次.更奇怪的是,它在三星Galaxy平板电脑版本4.4.2上运行良好,但不适用于摩托罗拉(Moto E 4.4.4).
我的服务:
public class change_wallpepar extends Service {
@Override …Run Code Online (Sandbox Code Playgroud) 我正在尝试从我的应用程序更改锁定屏幕背景图像,但我无法弄清楚如何做到这一点.我成功地使用WallPaperManager更改了主屏幕壁纸,但找不到为锁定屏幕执行相同操作的源.我知道QuickPic和Stock Gallery这样的应用程序会这样做,所以我该如何实现呢?
这是我用来更改主屏幕的代码:
WallpaperManager myWallpaperManager = WallpaperManager
.getInstance(getApplicationContext());
try {
myWallpaperManager.setBitmap(bm);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
有人实施了这个请指出我正确的方向与我的应用程序这样做?
这是最新版本 Android 中的 WallpaperManager 的错误吗?
设置壁纸时,会自动销毁并重新加载当前activity。
此行为似乎仅影响 Android 12 及更高版本。用 Kotlin 编写代码非常容易复制:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val randomResourceList = arrayListOf(R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4, R.drawable.image5)
val randomValue = (0 until randomResourceList.size).random()
val wallpaper = randomResourceList[randomValue]
val bmp = BitmapFactory.decodeResource(resources, wallpaper)
val wallpaperManager = WallpaperManager.getInstance(this)
wallpaperManager.setBitmap(bmp, null, true)
}
override fun onDestroy() {
super.onDestroy()
Log.d("tag", "Destroyed.")
}
Run Code Online (Sandbox Code Playgroud)
添加一些图像(包括几张,因为如果壁纸图像与上一个相同,则不会设置壁纸,因此是随机的)
然后,您应该看到活动被销毁并在一个周期中重新加载。不会引发任何错误,并且壁纸实际上每次都会更改。
在我的特定情况下,在前台服务中的计时器上设置壁纸时,这会造成严重破坏。如果更换壁纸时用户恰好在屏幕上进行活动,则该活动将会被破坏。
为什么我在包含的行上会出现弃用错误setWallpaper(bmp),如何解决?
错误:不推荐使用Context类型的方法setWallpaper(Bitmap)
switch(v.getId()){
case R.id.bSetWallpaper:
try {
getApplicationContext().setWallpaper(bmp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
Run Code Online (Sandbox Code Playgroud) 我使用下面的代码检索android 8.1手机上的android锁屏壁纸:
WallpaperManager manager = WallpaperManager.getInstance(getActivity());
ParcelFileDescriptor pfd = manager.getWallpaperFile(WallpaperManager.FLAG_LOCK);
if (pfd == null) // pfd is always null for FLAG_LOCK, why?
return;
Bitmap lockScreenWallpaper = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
// ...
Run Code Online (Sandbox Code Playgroud)
我已经授予了READ_EXTERNAL_STORAGE许可并预先设置了锁屏壁纸.
我在真正的手机上运行演示,发现pfd它总是为空FLAG_LOCK,所以我无法获得锁屏壁纸.请帮忙解决问题,谢谢.
那么,有两个问题与此相同( 如何在WallpaperManager中使用getCropAndSetWallpaperIntent方法? AND 如何使用getCropAndSetWallpaperIntent? ),但两者都没有答案.希望得到一个答案,我问这个 - 如何使这个方法工作.
这不起作用
WallpaperManager wallpaperManager = WallpaperManager.getInstance(MainActivity.this);
Uri uri = Uri.parse("android.resource://lv.revo.inspicfootballhd/drawable/v1");
Intent intent = new Intent(wallpaperManager.getCropAndSetWallpaperIntent(uri));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
logcat显示了这一点
5891-5891/? E/AndroidRuntime? FATAL EXCEPTION: main
Process: lv.revo.inspicfootballhd, PID: 5891
java.lang.IllegalArgumentException: Image URI must be of the content scheme type
at android.app.WallpaperManager.getCropAndSetWallpaperIntent(WallpaperManager.java:760)
at lv.revo.inspicfootballhd.MainActivity.onTouch(MainActivity.java:236)
at android.view.View.dispatchTouchEvent(View.java:7701)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2338)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568)
at android.app.Activity.dispatchTouchEvent(Activity.java:2465)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2285)
at android.view.View.dispatchPointerEvent(View.java:7886) …Run Code Online (Sandbox Code Playgroud) 我开发了一个动态壁纸应用程序,它只能从谷歌的动态壁纸应用程序访问,但像小米、Oppo 这样的手机有自己的壁纸应用程序,而我的应用程序没有显示在他们的壁纸部分。谁能帮我解决这个问题或将我重定向到一个想法来解决这个问题?
这是我的 Wallpaper.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<wallpaper
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/wallpaper_description"
android:thumbnail="@raw/element1"
android:settingsActivity=""/>
Run Code Online (Sandbox Code Playgroud)
这是我的清单文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.edustan.mywallpaper">
<uses-feature
android:name="android.software.live_wallpaper"
android:required="true" />
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="AllowBackup,GoogleAppIndexingWarning" >
<service
android:name=".MyWallpaperService"
android:enabled="true"
android:label="Wallpaper Example "
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/wallpaper" />
</service>
</application>
Run Code Online (Sandbox Code Playgroud)
这是我的 WallpaperService 类文件
@Override
public Engine onCreateEngine() {
return new MyWallpaperEngine();
}
private class MyWallpaperEngine extends Engine{
public Bitmap image1, image2, image3;
private int count_new =0;
private …Run Code Online (Sandbox Code Playgroud) 我想创建一个应用程序,允许用户通过单击按钮将图像设置为壁纸.此图像将位于网址中,并且墙纸的设置通过AsyncTask执行.我按照此视频中显示的步骤进行了操作:https://www.youtube.com/watch?v = JeA8Z8dtD10,但它对我不起作用.该应用程序显示按钮,但当我点击它时会发生任何事情.
这是代码:
package com.example.myapplication4;
import android.app.Activity;
import android.app.ProgressDialog;
import android.app.WallpaperManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import javax.net.ssl.HttpsURLConnection;
public class MainActivity extends Activity {
public ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnSetWallpaper = (Button) findViewById(R.id.button);
btnSetWallpaper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String urlImage ="https://www.geektopia.es/storage/geek/posts/2015/08/17/marshmallow.jpg";
new SetWallpaperTask().equals(urlImage);
}
}); …Run Code Online (Sandbox Code Playgroud) getCropAndSetWallpaperIntent()在android中使用时出现此错误
D/Exception: java.lang.IllegalArgumentException: Cannot use passed URI to set wallpaper; check that the type returned by ContentProvider matches image/*
Run Code Online (Sandbox Code Playgroud)
但是当我检查Content使用类型时,ContentResolver我得到了
D/CONTENT TYPE:: IS: image/jpeg
那么为什么Wallpaper Manager给我内容错误?
这是我用来获取图像 URI 的代码
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
tempPath = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
Log.d("URI OF SET IMAGE", tempPath);
ContentResolver cr = this.getContentResolver();
Log.d("CONTENT TYPE: ", "IS: " + cr.getType(Uri.parse(tempPath)));
return Uri.parse(tempPath);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
android android-contentresolver android-contentprovider android-wallpaper
当用户选择的壁纸太亮或太暗时,我想更改我的文本视图颜色,基本上充当最新的启动器,例如,如果设置白色壁纸,请将所有文本视图更改为深色,但我不知道如何检测到这一点。
帮助。提前致谢。