小编she*_*lll的帖子

Android精确闹钟总是3分钟

我有一个应用程序,它使用它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)

android alarmmanager wear-os

18
推荐指数
1
解决办法
6359
查看次数

android locale随机更改回默认值

我有一个活动,在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%可重复,它只发生了一些时间,我也有用户的报告.一旦应用程序启动并且在切换几个选项卡后它没有更改语言环境,那么它将正确直到退出.

android locale

14
推荐指数
1
解决办法
4270
查看次数

亚马逊转录没有SDK的Streaming API

我正在尝试使用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)

go amazon-web-services aws-sdk aws-transcribe

12
推荐指数
1
解决办法
1462
查看次数

DrawableCompat setTint对具有相同id的所有新Drawable进行着色

我有聊天泡泡,我想在某些情况下着色:

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.+.这是一个知道的错误还是我做错了什么?

android tint android-appcompat android-drawable

11
推荐指数
1
解决办法
1683
查看次数

app widget setImageViewUri不更新图像

我有一个应用程序小部件,其中只包含一个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)

android uri widget android-imageview android-appwidget

10
推荐指数
1
解决办法
4872
查看次数

FLAG_TURN_SCREEN_ON并不总是有效

我从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 screen wakeup

10
推荐指数
3
解决办法
7988
查看次数

在Android 2.3中重新启动崩溃的服务后,不会调用onStartCommand()

我有Android服务重启的问题.我正在构建针对API版本7并在具有Android 2.3.3的设备上运行.

问题是,当我的服务被系统杀死并稍后重新启动时,只onCreate()调用我的服务.代码输入onStartCommand()未执行.如果我是第一次启动我的应用程序,onStartCommand()通常会执行代码并且一切正常,直到系统终止我的服务,然后服务将无法正确重启.

文档说,onStartCommand()在重新启动服务时始终会调用它.在服务重启的情况下,onStartCommand()应该使用null intent调用.这不是我的情况.

知道为什么会这样吗?

service android restart

9
推荐指数
1
解决办法
7115
查看次数

NotificationListenerService和Doze模式以及App Standby

我有一个应用程序,可以收听电话通知,并通过以下方式向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

9
推荐指数
1
解决办法
1346
查看次数

如何应对华为和小米的"电池优化"

我有一个应用程序,通过侦听通知NotificationListenerService.我的应用程序在打盹模式和应用程序中都能幸免于几乎所有手机(如果设置正确,例如异常或前台服务).

然后来华为和小米用他们自己的Android修改来"改善电池寿命".这些可能会严重影响后台运行的应用程序,以至于在一两个星期之后必须重新安装应用程序.即使清除数据也不会"解冻"应用程序.即使是他们自己的"优化"的例外也无法可靠地解决这个问题.只有完全禁用所有优化,例如启用"高性能模式"可能会解决这个问题.但是用户不想禁用这些选项.

你是如何处理这些案件的?我们怎样才能阻止制造商停止搞乱核心Android?更不用说有趣的ANR和崩溃Zygote:(

android android-service android-doze-and-standby huawei android-doze

9
推荐指数
1
解决办法
2857
查看次数

具有继承接口的会议室DAO

我有一个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注释的情况下实现我想要的?

android android-room

9
推荐指数
2
解决办法
1863
查看次数