应用程序小部件点击在模拟器上工作,但在真实设备上第一次工作,然后 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 中请求该权限,这对我有用。

一般来说,总是值得先在自己的应用程序中测试要嵌入PendingIntentIntent,如果它不起作用,您可以在其中捕获异常。

顺便说一句,我有一个可以工作的数字时钟小部件,它可以启动我的三星 Galaxy S21 上的内置时钟应用程序。我打算等到我对配置器进行了更多改进后再将代码发布到 github 上,但我现在将其发布(准备 github 版本并将其放在那里需要一两个小时)以帮助您和其他任何在使此类小部件正常工作时遇到问题的人。

【讨论】:

现在发布在 github 上的 rparkins999 / AndroidSecondsClockWidget

以上是关于应用程序小部件点击在模拟器上工作,但在真实设备上第一次工作,然后 onclick 永远不会响应的主要内容,如果未能解决你的问题,请参考以下文章

C# 推送通知在模拟器上工作但在真实设备上不工作

android套接字在模拟器上工作,但在我的真实设备上不工作

截图在模拟器中有效,但在真实设备上失败

UIButton 在第一次运行时工作正常,但在模拟器上第二次运行时不起作用

后台获取在模拟器中工作但在真实设备中不工作

应用程序在少数模拟器上运行,但在真实设备上崩溃 [重复]