应用程序小部件点击在模拟器上工作,但在真实设备上第一次工作,然后 onclick 永远不会响应
Posted
技术标签:
【中文标题】应用程序小部件点击在模拟器上工作,但在真实设备上第一次工作,然后 onclick 永远不会响应【英文标题】:App widget on click working on emulator but on real device works for the first time then onclick is never responded 【发布时间】:2020-10-22 16:51:39 【问题描述】:我已经搜索了 2 天,但没有任何效果。我是初学者,正在尝试使用应用小部件。我正在尝试制作一个可以在点击时打开时钟的数字时钟小部件。但不幸的是,点击不适用于真实设备。它可以在模拟器中正常工作,但不能在真实设备上工作。 我的 appwidgetProvider
package com.example.secondtrywidget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.provider.AlarmClock;
import android.widget.RemoteViews;
public class ExampleAppWidgetProvider extends AppWidgetProvider
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
for (int appWidgetId : appWidgetIds)
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_widget);
//Intent openClockIntent=new Intent(context,ExampleAppWidgetProvider.class);
//openClockIntent.setAction(AlarmClock.ACTION_SHOW_ALARMS);
Intent openClockIntent = new Intent(AlarmClock.ACTION_SHOW_ALARMS);
openClockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, openClockIntent, 0);
views.setOnClickPendingIntent(R.id.example_widget_button, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
我的配置
package com.example.secondtrywidget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.provider.AlarmClock;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RemoteViews;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.textfield.TextInputEditText;
import com.skydoves.colorpickerpreference.ColorEnvelope;
import com.skydoves.colorpickerpreference.ColorListener;
import com.skydoves.colorpickerpreference.ColorPickerView;
public class ExampleAppWidgetConfig extends AppCompatActivity
CheckBox checkbox;
TextInputEditText hexcode;
RadioGroup zonegroup;
TextView demo;
ColorPickerView colorPickerView;
int init=R.color.clockcolor;
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example_app_widget_config);
zonegroup=findViewById(R.id.zonegroup);
zonegroup.clearCheck();
demo=findViewById(R.id.demo);
zonegroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i)
RadioButton rdb=(RadioButton)radioGroup.findViewById(i);
);
colorPickerView=findViewById(R.id.colorPickerView);
colorPickerView.setColorListener(new ColorListener()
@Override
public void onColorSelected(ColorEnvelope colorEnvelope)
init=colorEnvelope.getColor();
demo.setTextColor(Color.parseColor("#"+Integer.toHexString(init)));
);
checkbox=findViewById(R.id.checkbox);
hexcode=findViewById(R.id.hexcode);
findViewById(R.id.color1).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color1;
demo.setTextColor(getResources().getColor(R.color.color1));
);
findViewById(R.id.color2).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color2;
demo.setTextColor(getResources().getColor(R.color.color2));
);
findViewById(R.id.color3).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color3;
demo.setTextColor(getResources().getColor(R.color.color3));
);
findViewById(R.id.color4).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color4;
demo.setTextColor(getResources().getColor(R.color.color4));
);
findViewById(R.id.color5).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color5;
demo.setTextColor(getResources().getColor(R.color.color5));
);
findViewById(R.id.color6).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color6;
demo.setTextColor(getResources().getColor(R.color.color6));
);
findViewById(R.id.color7).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color7;
demo.setTextColor(getResources().getColor(R.color.color7));
);
findViewById(R.id.color8).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color8;
demo.setTextColor(getResources().getColor(R.color.color8));
);
findViewById(R.id.color9).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
init=R.color.color9;
demo.setTextColor(getResources().getColor(R.color.color9));
);
Intent configIntent = getIntent();
Bundle extras = configIntent.getExtras();
if (extras != null)
appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
setResult(RESULT_CANCELED, resultValue);
if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID)
finish();
// editTextButton = findViewById(R.id.edit_text_button);
public void confirmConfiguration(View v)
if(init<0)
init=R.color.clockcolor;
String color="#"+Integer.toHexString(getResources().getColor(init));
if(checkbox.isChecked()&&!(hexcode.getText().toString().equalsIgnoreCase("")))
color=hexcode.getText().toString();
String hrtw=null;
String hrtf=null;
int selectedId=zonegroup.getCheckedRadioButtonId();
if(selectedId==-1||selectedId==R.id.smallhour)hrtw="hh:mm";
else if(selectedId==R.id.largehour)hrtf="k:mm";
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
// String buttonText = editTextButton.getText().toString();
RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.example_widget);
views.setTextColor(R.id.simpleDigitaldate, Color.parseColor(color));
views.setTextColor(R.id.simpleDigitalClock, Color.parseColor(color));
views.setCharSequence(R.id.simpleDigitalClock,"setFormat12Hour",hrtw);
views.setCharSequence(R.id.simpleDigitalClock,"setFormat24Hour",hrtf);
//Intent openClockIntent=new Intent(ExampleAppWidgetConfig.this,ExampleAppWidgetProvider.class);
//openClockIntent.setAction(AlarmClock.ACTION_SHOW_ALARMS);
Intent openClockIntent = new Intent(AlarmClock.ACTION_SHOW_ALARMS);
openClockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, openClockIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.example_widget_button,pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
setResult(RESULT_OK, resultValue);
finish();
我的清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.secondtrywidget">
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<application
android:allowBackup="true"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:roundIcon="@drawable/logo"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".ExampleAppWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/exampe_appwidget_info" />
</receiver>
<activity android:name=".ExampleAppWidgetConfig"
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
</application>
</manifest>
我的信息
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:configure="com.example.secondtrywidget.ExampleAppWidgetConfig"
android:initialLayout="@layout/example_widget"
android:minHeight="40dp"
android:minResizeWidth="40dp"
android:minWidth="110dp"
android:resizeMode="vertical|horizontal"
android:updatePeriodMillis="3600000"
android:widgetCategory="home_screen">
</appwidget-provider>
请帮助某人解决问题,因为我渴望制作小部件,但这个问题停止了我的学习。
【问题讨论】:
【参考方案1】:我没有看到您明确做“错误”的任何事情,但我怀疑它与减速上下文有关,因为 RemoteViews 在这方面可以表现得很有趣。
将您的意图变量减速移到 for 循环之外将修复您的错误。 无论如何,它是更好的编码实践。
Intent openClockIntent = new Intent(AlarmClock.ACTION_SHOW_ALARMS);
openClockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, openClockIntent, 0);
for (int appWidgetId : appWidgetIds)
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_widget);
views.setOnClickPendingIntent(R.id.example_widget_button, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
祝你好运!
【讨论】:
感谢您的回答。但是我尝试了这种方式,但仍然无法正常工作。【参考方案2】:你的真实设备是什么?一些三星手机(例如我的 Galaxy S21)需要 SET_ALARM 权限才能访问 AlarmClock.ACTION_SHOW_ALARMS。尝试在您的 AndroidManifest.xml 中请求该权限,这对我有用。
一般来说,总是值得先在自己的应用程序中测试要嵌入PendingIntent
的Intent
,如果它不起作用,您可以在其中捕获异常。
顺便说一句,我有一个可以工作的数字时钟小部件,它可以启动我的三星 Galaxy S21 上的内置时钟应用程序。我打算等到我对配置器进行了更多改进后再将代码发布到 github 上,但我现在将其发布(准备 github 版本并将其放在那里需要一两个小时)以帮助您和其他任何在使此类小部件正常工作时遇到问题的人。
【讨论】:
现在发布在 github 上的 rparkins999 / AndroidSecondsClockWidget以上是关于应用程序小部件点击在模拟器上工作,但在真实设备上第一次工作,然后 onclick 永远不会响应的主要内容,如果未能解决你的问题,请参考以下文章
android套接字在模拟器上工作,但在我的真实设备上不工作