我需要通过以下方式提醒用户某些事件:
振动应无限期地保持开启,直到用户确认通知为止.
问题是当设备进入睡眠状态时振动停止.我已经阅读了以下问题:
当屏幕关闭时允许手机
振动即使在Android中屏幕进入睡眠模式后仍继续振动
有一个答案到的上述问题,说没有振动模式的伎俩之一.所以我试过调用它的版本Vibrator.vibrate接受毫秒而不是大数量的模式,但振动仍然停止.
其他答案建议在ACTION_SCREEN_OFF行动中登记接收者.如果设备在警报开始后进入休眠状态,这将允许我恢复振动,但如果设备已经睡眠则无法工作.
但是,如果我能够首先打开屏幕,然后注册接收器以处理可能从那里发生的任何屏幕关闭事件,我可以让事情正常工作.因此,在接收到触发事件之前,我已经尝试获取完全唤醒锁定,然后开始声音或振动,但是尽管我使用了标志FULL_WAKE_LOCK和ACQUIRE_CAUSES_WAKEUP,但它仍无效.唤醒部分工作,但不久之后设备再次进入睡眠状态.我想FULL_WAKE_LOCK标志不起作用,因为它在API 17中已被弃用,但我的设备是运行4.1.2的三星,这是API 16!
现在推荐的方法似乎是使用 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,但这应该从一个活动中调用,除非用户点击通知,否则我没有任何屏幕,如果发生这种情况,声音和振动应该已经有了被拦了
所以它看起来像一个死胡同.
我还能尝试什么?
更新:
我没有运气保持屏幕始终打开唤醒锁,但另一方面,他们允许我打开屏幕,如果只有几秒钟.我实际上不需要保持屏幕,所以我在Intent.ACTION_SCREEN_OFF动作上注册接收器,当屏幕熄灭时,接收器再次恢复振动.这在三星上运行良好,但我现在已切换到华为继续测试,接收器不起作用.
更新:
这是华为设备中异常的堆栈跟踪:
java.util.NoSuchElementException: Death link does not exist
at android.os.BinderProxy.unlinkToDeath(Native Method)
at com.android.server.VibratorService.unlinkVibration(VibratorService.java:294)
at com.android.server.VibratorService.removeVibrationLocked(VibratorService.java:284)
at com.android.server.VibratorService.cancelVibrate(VibratorService.java:213)
at android.os.IVibratorService$Stub.onTransact(IVibratorService.java:83)
at android.os.Binder.execTransact(Binder.java:338)
at dalvik.system.NativeStart.run(Native Method)
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序(已经发布),我已经开发了振动的新功能.所以我添加了新的权限:
<uses-permission
android:name="android.permission.VIBRATE" />
Run Code Online (Sandbox Code Playgroud)
发布更新后我注意到我的Nexus 7 2013没有得到更新,可能是因为这个设备根本就没有Vibrator ...所以在下一个版本中我已经将上面的行更改为
<uses-feature
android:name="android.permission.VIBRATE"
android:required="false"/>
Run Code Online (Sandbox Code Playgroud)
这可能是正确的...然后我的Nexus成功更新了.但现在我在设备4.0-4.3上偶尔会看到崩溃
致命异常:java.lang.SecurityException需要VIBRATE权限
据我所知,line android:required仅适用于uses-feature而不适用于uses-permission,因此问题是:如何声明VIBRATE允许安装在无振动设备上的适当权限,以及避免SecurityException使用旧的,不幸的仍然受支持的设备?
PS.目前我认为正确的烫发声明应该如下所示,但我不想在生产环境上"测试"声明.任何人都可以确认吗?
<uses-permission
android:name="android.permission.VIBRATE"
android:maxSdkVersion="18" />
Run Code Online (Sandbox Code Playgroud)
基于新设备上的碰撞和仍然工作的振动,即使可能不适合VIBRATOR uses-feature声明(因此目前没有许可).也许既然KitKat没有必要像在SD上写一样来声明振动烫发?我在文档中找不到任何相关内容...另外:上述声明存在于维基百科官方应用程序中
编辑 - 更复杂的信息:引入数量100 uses-permission,Nexus 7没有得到更新.一周后101发布没有任何清单更改(除了版本号ofc)和与此新功能相关的代码(其他组件中的错误修正),Nexus仍然没有更新.下周和rel 102,没有变化.然后我改为uses-feature103并且Nexus在同一天得到更新...并且因为这个版本崩溃开始发生在4.0-4.3
我使用这个好的库来检测Android设备上的抖动.一切都是好的!但在我的手机(索尼Xperia P)接收短信导致我的手机振动和震动检测到!
在像HTC Sensation XE这样的其他手机中,问题不存在.
有什么建议吗?
谢谢你的提前.
这让我很好奇,是否可以保证 50ms 在所有设备上都有效?有没有办法以编程方式确定振动器的规格并相应地设置振动持续时间?或者可能是一种判断振动器是否振动的方法。
我是Android开发的新手.我想创建一个本质上是音乐播放器的应用程序,但手机可以振动到音乐播放的节拍.我记得最早的诺基亚手机有这个功能,我想重新创造这个功能.
我的问题:这是否可以作为Android应用程序?如果是这样,一般方法是什么?我是否必须分析歌曲的声音模式然后改变振动强度?
谢谢!
我正在开发Android Wear OS 2.0应用程序.每当用户从给定号码获得SMS时,手表应该开始振动,并且应该出现具有给定文本的UI,其具有停止振动的按钮.它的工作方式如下:
在SmsReciever.java我正在检查电话号码是否匹配,或者UI屏幕是否已经激活.
public class SmsReceiver extends BroadcastReceiver {
//interface
private static SmsListener mListener;
@Override
public void onReceive(Context context, Intent intent) {
Bundle data = intent.getExtras();
Object[] pdus = (Object[]) data.get("pdus");
for(int i=0;i<pdus.length;i++){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i], "3gpp");
String sender = smsMessage.getDisplayOriginatingAddress();
String alertPhoneNumber = "301112233";
if (sender.toLowerCase().contains(alertPhoneNumber.toLowerCase()))
{
String messageBody = smsMessage.getMessageBody();
//Pass the message text to interface
mListener.messageReceived(messageBody);
} else if (AlarmActivity.active) {
Intent intent1 = new Intent();
intent1.setClassName("hu.asd.watchtest", "hu.asd.watchtest.AlarmActivity");
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
} …Run Code Online (Sandbox Code Playgroud) 当数字发送短信时,我的应用程序应该产生振动。振动应一直持续到用户触摸按钮为止。在测试应用程序时,我正在从不同的设备发送多条短信,包括一条带有选中数字的短信。我总是设法发送文本,这只会停止振动,尽管记录显示振动应该已经开始,但是并没有继续。它可能会在2条消息或40条消息之后随机发生。
我当时在想,设备通知的振动可能会以某种方式干扰我的振动,同时访问该振动Vibrator。
或因为这是我使用android做的第一件事,所以我做错了。
这是我的AlarmActivity.java类,它处理振动MainActivity,当收到新消息时,总是从via Intent 调用它:
public class AlarmActivity extends WearableActivity {
static boolean active = false;
static boolean isVibrating = false;
private Vibrator vibrator;
final long[] mVibratePattern = new long[]{0, 400, 800, 600, 800, 800, 800, 1000};
final int[] mAmplitudes = new int[]{0, 255, 0, 255, 0, 255, 0, 255};
private PowerManager.WakeLock wakeLock;
@Override
public void onResume() {
super.onResume();
active = true;
}
@Override
public void onStart() {
super.onStart();
active = true;
PowerManager …Run Code Online (Sandbox Code Playgroud) 我的应用程序的目标平台是 Android 13 (API 33)。我的应用程序有振动模式。当我将应用程序置于振动模式时,它会根据操作振动而不是播放声音。我面临的问题是,在 Android 13 中,当“振动和触觉”从设置中关闭时,我的应用程序的振动也无法正常工作。即使“振动和触觉”在手机级别关闭,我的应用程序振动也始终有效吗?
我们有什么方法可以在代码中知道“振动和触觉”是打开还是关闭吗?
我想在我的应用程序主页中添加振动和播放音乐意味着当我的应用程序启动它振动并播放铃声,直到我没有按下按钮进入另一个活动意味着它在我去其他活动后停止振动和声音...我的清单文件如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidpeople.tab"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable= "true">
<uses-library android:name="com.google.android.maps" />
<activity android:name=".SplashScreen"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="currentlocmap"/>
<activity android:name="filter"/>
<activity android:name="keywordsearch"/>
<activity android:name="keywordxmlparsing" />
<activity android:name="Artistspacedetailview" />
<activity android:name="loadingimage"/>
<activity android:name="keywordpagetabs"/>
<activity android:name="filterpagetabs"/>
<activity android:name="artistspacedetailviewTab"/>
</application>
<supports-screens android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true" />
Run Code Online (Sandbox Code Playgroud)
我正在为Android API 23创建一个应用程序,我想获取手机响起时使用的默认振动模式吗?
到目前为止,我有:
Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
long[] pattern = {0, 500, 1000}; // default pattern goes here
vibrator.vibrate(pattern, 0);
Run Code Online (Sandbox Code Playgroud)
如何获得默认模式?
android ×10
android-13 ×1
android-sms ×1
audio-player ×1
java ×1
media-player ×1
ringtone ×1
shake ×1
vibration ×1
wakelock ×1
wear-os ×1