我有一个应用程序,它使用它AlarmManager来定时唤醒整个小时的电话,并发送消息到Android Wear手表,这是一个短暂的振动.我有两个用户使用三星Galaxy S6和Android 5.1.1,索尼SW 3和5.1.1有一个奇怪的错误.在第一个整小时,振动处于准确的时间,但所有其他振动都延迟了3分钟.有时即使是第一个整小时的振动也会延迟.
这是一些代码:
final Calendar time = Calendar.getInstance();
time.set(Calendar.SECOND, 0);
time.set(Calendar.MILLISECOND, 0);
time.set(Calendar.MINUTE, 0);
time.set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY) + 1);
final Intent hourlyChimeIntent = new Intent(context, HourlyChimeReceiver.class);
hourlyChimeIntent.setAction(key);
final AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
final PendingIntent pi = PendingIntent.getBroadcast(context, 0, hourlyChimeIntent, PendingIntent.FLAG_CANCEL_CURRENT);
am.setExact(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pi);
Run Code Online (Sandbox Code Playgroud)
我WakeLock在接收器中获取了一个,然后在一个线程中向Wear手表发送消息.没有振动,他们只是迟到3分钟.
我没有关于这个问题的其他报告,我的所有测试设备都运行良好.我没有三星设备.
什么可能导致3分钟延迟的想法?三星是否会忽略setExact并使我的警报不准确?如何强制三星的确切警报?
编辑:
这是Android Wear特定代码.在接收者的onReceive方法中我这样做:
final PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
final PowerManager.WakeLock lock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, BuildConfig.APPLICATION_ID);
lock.acquire(7L * 1000L);
final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context).addApi(Wearable.API).build();
new …Run Code Online (Sandbox Code Playgroud) 我有一个活动,在onCreate我从首选项加载语言并设置这样的语言环境:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en");
Locale newLocale = new Locale(lang);
Locale.setDefault(newLocale);
Configuration config = new Configuration();
config.locale = newLocale;
final Resources res = getResources();
res.updateConfiguration(config, res.getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)
我也重写了onConfigurationChanged
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en");
Locale newLocale = new Locale(lang);
Locale.setDefault(newLocale);
Configuration config = new Configuration();
config.locale = newLocale;
final Resources res = getResources();
res.updateConfiguration(config, res.getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)
我有一个带有FragmentPagerAdapter的ViewPager和android 2.3.7上的三个标签.问题是,有时在切换选项卡时,应用程序的语言环境会恢复为英语,因此UI从现在开始混合语言.我总是为适配器的getItem()方法中的选项卡创建新的片段.如果我旋转设备,区域设置再次正确.
我也尝试在清单中放置android:configChanges ="locale"而不是覆盖onConfigurationChanged(),但结果是一样的.
最糟糕的是,它不是100%可重复,它只发生了一些时间,我也有用户的报告.一旦应用程序启动并且在切换几个选项卡后它没有更改语言环境,那么它将正确直到退出.
我正在尝试使用Go 1.11中亚马逊的新流式转录API.目前亚马逊只提供Java SDK,所以我尝试的是低级方式.
唯一相关的文档是在这里,但它没有显示端点.我在Java示例中找到了它https://transcribestreaming.<region>.amazonaws.com并且我正在尝试爱尔兰地区,即https://transcribestreaming.eu-west-1.amazonaws.com.这是我打开HTTP/2双向流的代码:
import (
"crypto/tls"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/aws/external"
"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
"golang.org/x/net/http2"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"time"
)
const (
HeaderKeyLanguageCode = "x-amzn-transcribe-language-code" // en-US
HeaderKeyMediaEncoding = "x-amzn-transcribe-media-encoding" // pcm only
HeaderKeySampleRate = "x-amzn-transcribe-sample-rate" // 8000, 16000 ... 48000
HeaderKeySessionId = "x-amzn-transcribe-session-id" // For retrying a session. Pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
HeaderKeyVocabularyName = "x-amzn-transcribe-vocabulary-name"
HeaderKeyRequestId = "x-amzn-request-id"
)
...
region := "eu-west-1"
cfg, err := external.LoadDefaultAWSConfig(aws.Config{
Region: region,
})
if err != nil { …Run Code Online (Sandbox Code Playgroud) 我有聊天泡泡,我想在某些情况下着色:
Drawable bubbleDrawable = ContextCompat.getDrawable(context, R.drawable.bg_chat_bubble);
if (tint) {
bubbleDrawable = DrawableCompat.wrap(bubbleDrawable);
DrawableCompat.setTint(bubbleDrawable, bubbleTint);
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦它R.drawable.bg_chat_bubble(它是一个9补丁)被着色,那么所有的调用都会ContextCompat.getDrawable(context, R.drawable.bg_chat_bubble)返回有色图像而不是原始图像.即使我关闭聊天并打开完全不同的聊天,那里的气泡也有之前的色彩.只有杀死应用程序才有助于恢复正确的颜色.直到第一个色调......
即使bubbleDrawable = ContextCompat.getDrawable(context, R.drawable.bg_chat_bubble)在调用后直接设置色调分支内部也会setTint给出有色图像而不是原始图像.
我也试过,getResources().getDrawable(R.drawable.bg_chat_bubble)但结果是一样的.因此,一旦我想为任何可绘制的resrouce使用色调,我必须始终为该资源设置一个色调,否则我会得到不可预测的结果.
这种情况发生在Android 5.1(可能还有其他)以及appcompat-v7:23.2.+和appcompat-v7:23.1.+.这是一个知道的错误还是我做错了什么?
我有一个应用程序小部件,其中只包含一个imageview.我重绘该图像并将其作为png存储在应用程序的私有内存中,然后我使用uri(widget.setImageViewUri(R.id.widget_icon,uri))设置RemoteViews的图像,而不是自己发送位图,因为非常罕见我得到的情况!失败的粘合剂交易!
问题是,随着图像随时间的变化,窗口小部件的图像不会改变.我用root explorer检查了保存的png并且它已正确更新.但不显示正确的图像.每个小部件显示从添加到主屏幕时的图像.如果我使用setImageViewBitmap(...)它可以正常工作,除了罕见的失败的活页夹事务.
我使用以下方法从服务更新小部件.它不适用于Android 2.3.7以及运行2.2的模拟器.可能是什么问题呢?是以某种方式缓存?
public void updateWidget(Context context) {
// redraws the widget's image
updateIcon();
OutputStream stream;
try {
stream = context.openFileOutput("icon.png", Context.MODE_WORLD_READABLE);
}
catch (FileNotFoundException ex) {
ex.printStackTrace();
return;
}
m_Icon.compress(CompressFormat.PNG, 100, stream);
try {
stream.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class));
Intent intent = new Intent(context, MyDialog.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent clickIntent = PendingIntent.getActivity(context, 0, intent, 0);
File file = new File(context.getFilesDir().getAbsolutePath() + File.separator + "icon.png");
// Uri …Run Code Online (Sandbox Code Playgroud) 我从BroadcastReceiver启动一个活动,它由alaram(RTC_WAKEUP类型)触发.在onCreate的那个活动我添加这些标志
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
);
Run Code Online (Sandbox Code Playgroud)
问题是有时(大约10%的情况)屏幕无法打开.警报被正确触发(我这里是通知的声音,这也是在接收器的onReceive()中触发的.然后,如果我按下电话的电源按钮,屏幕会亮起,显示我的活动,并立即关闭.那个,电源按钮工作正常.这发生在android 2.3.7上,这里是onReceive()方法
@Override
public void onReceive(Context context, Intent intent) {
m_Context = context;
Bundle extras = intent.getExtras();
final int id = extras.getInt("timer_id");
Intent activityIntent = new Intent(m_Context, MyActivity.class);
activityIntent.putExtra("timer_id", id);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
m_Context.startActivity(activityIntent);
// and now load the alarm sound and play it for the desired time
showFinishedNotification();
}
Run Code Online (Sandbox Code Playgroud)
我想避免使用PowerManager,因为它需要一个权限,并且标志是首选的方式.
什么可能是一个问题?logcat没有显示任何问题......
我有Android服务重启的问题.我正在构建针对API版本7并在具有Android 2.3.3的设备上运行.
问题是,当我的服务被系统杀死并稍后重新启动时,只onCreate()调用我的服务.代码输入onStartCommand()未执行.如果我是第一次启动我的应用程序,onStartCommand()通常会执行代码并且一切正常,直到系统终止我的服务,然后服务将无法正确重启.
文档说,onStartCommand()在重新启动服务时始终会调用它.在服务重启的情况下,onStartCommand()应该使用null intent调用.这不是我的情况.
知道为什么会这样吗?
我有一个应用程序,可以收听电话通知,并通过以下方式向Android Wear手表发送消息MessageApi.一些设备运行良好,除了Android 6的一些设备,特别是华为Mate 8(看起来像所有华为Android 6的这样做).
华为有自己的冻结应用程序后台处理(受保护的应用程序)的实现.从用户报告中我已经确认我的应用程序在华为的受保护应用程序和Android 6的打盹模式中都有例外.该应用程序工作正常,但在显示关闭15分钟后,我的应用程序停止向连接的Android Wear手表发送消息.我的应用程序还可以记录收到的通知历史记录,15分钟后没有任何内容...直到手机的显示屏打开并且我的应用程序打开.之后,在手机显示屏关闭时应该收到的所有通知都会进入我的NotificationListenerService实施并立即发送到手表.记录的历史也证实了这一点.
任何想法如何为这些手机解决这个问题,尤其是带有Doze模式的Android 6的华为Mate 8?
NotificationListenerService设备处于打盹模式和/或应用程序处于待机模式时的正确行为是什么?
编辑
用户还确认他们的手机未处于省电模式,这也会影响后台应用及其服务.这个bug看起来像华为独家,因为没有Nexus用户报告这个,我的OnePlus One和M也没有这样做.N预览也适用于Nexus设备.
编辑2
我添加了一个可选的前台服务(startForeground()),因此我的应用程序在通知中心有一个永久通知,因此我的应用程序应该从每个电池优化中排除.对于前台服务通知,我使用了优先级,NotificationCompat.PRIORITY_MIN并添加了Notification.FLAG_ONGOING_EVENT标志.这对华为手机有点帮助但不多,现在NotificationListenerService在打开我的应用程序后打开屏幕后,延迟通知就会到达我的右边.我不使用startForeground()in NotificationListenerService而是使用另一个Service因为我无法控制它的生命周期.
android android-notifications android-appstandby android-doze wear-os
我有一个应用程序,通过侦听通知NotificationListenerService.我的应用程序在打盹模式和应用程序中都能幸免于几乎所有手机(如果设置正确,例如异常或前台服务).
然后来华为和小米用他们自己的Android修改来"改善电池寿命".这些可能会严重影响后台运行的应用程序,以至于在一两个星期之后必须重新安装应用程序.即使清除数据也不会"解冻"应用程序.即使是他们自己的"优化"的例外也无法可靠地解决这个问题.只有完全禁用所有优化,例如启用"高性能模式"可能会解决这个问题.但是用户不想禁用这些选项.
你是如何处理这些案件的?我们怎样才能阻止制造商停止搞乱核心Android?更不用说有趣的ANR和崩溃Zygote:(
android android-service android-doze-and-standby huawei android-doze
我有一个DAO接口,其中有多个实现,我希望其中一个可以成为Room实现(Kotlin):
interface BaseDao {
fun getAll(): Single<List<SomeData>>
fun insert(data: List<SomeData>)
}
Run Code Online (Sandbox Code Playgroud)
和我的房间(RxRoom)界面:
@Dao
interface RxRoomBaseDao: BaseDao {
@Query("SELECT * FROM some_data")
override fun getAll(): Single<List<SomeData>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
override fun insert(data: List<SomeData>)
}
Run Code Online (Sandbox Code Playgroud)
似乎Room编译器尝试为两种方法都编译BaseDao而不是RxRoomBaseDao和投诉。error: Dao class must be annotated with @Daoerror: A DAO method can be annotated with only one of the following:Insert,Delete,Query,Update
我也尝试了一个RxRoomBaseDao具有相同结果的抽象类。
这是Room编译器的已知错误或局限性吗?如何在不污染BaseDaoRoom注释的情况下实现我想要的?