我有一个由ICS用户发送的堆栈跟踪.
在我的Froyo设备上一切正常,但用户显然在AudioManager.startBluetoothSco()调用时获得权限拒绝...我不知道为什么会发生这种情况 - 我知道广播为ACTION_SCO_AUDIO_STATE_CHANGED 是粘性的,但它不是发送的应用程序它,所以它不应该需要许可......
下面是堆栈跟踪:
java.lang.SecurityException: Permission Denial: broadcastIntent() requesting a sticky
broadcast from pid=15341, uid=10064 requires android.permission.BROADCAST_STICKY
at android.os.Parcel.readException(Parcel.java:1327)
at android.os.Parcel.readException(Parcel.java:1281)
at android.media.IAudioService$Stub$Proxy.startBluetoothSco(IAudioService.java:1090)
at android.media.AudioManager.startBluetoothSco(AudioManager.java:975)
at de.bulling.smstalk.libs.utils.AudioUtils.startBluetoothSco(AudioUtils.java:164)
at de.bulling.smstalk.Services.TTS.speakIt(TTS.java:151)
at de.bulling.smstalk.Services.TTS.onInit(TTS.java:83)
at android.speech.tts.TextToSpeech.dispatchOnInit(TextToSpeech.java:627)
at android.speech.tts.TextToSpeech.access$1000(TextToSpeech.java:52)
at android.speech.tts.TextToSpeech$Connection.onServiceConnected(TextToSpeech.java:1279)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1068)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1085)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
/编辑:我可以重现这个问题,如果我是否启动服务START_STICKY并不重要.
我想使用以下代码从我的小部件发送广播:
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
Intent x = new Intent();
if (isActive == true) {
views.setImageViewResource(R.id.w_image, R.drawable.w_bild);
x.setAction("de.bulling.smstalk.DISABLE");
} else {
views.setImageViewResource(R.id.w_image, R.drawable.w_bild_off);
x.setAction("de.bulling.smstalk.ENABLE");
}
PendingIntent z = PendingIntent.getBroadcast(context, 0, x, PendingIntent.FLAG_ONE_SHOT);
views.setOnClickPendingIntent(R.id.w_image, z);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
E/RemoteViews(18176): Cannot send pending intent:
E/RemoteViews(18176): android.content.IntentSender$SendIntentException
E/RemoteViews(18176): at android.app.ContextImpl.startIntentSender(ContextImpl.java:640)
E/RemoteViews(18176): at android.widget.RemoteViews$SetOnClickPendingIntent$1.onClick(RemoteViews.java:157)
E/RemoteViews(18176): at android.view.View.performClick(View.java:2408)
E/RemoteViews(18176): at android.view.View$PerformClick.run(View.java:8816)
E/RemoteViews(18176): at android.os.Handler.handleCallback(Handler.java:587)
E/RemoteViews(18176): at android.os.Handler.dispatchMessage(Handler.java:92)
E/RemoteViews(18176): …Run Code Online (Sandbox Code Playgroud) 我正在使用CMU Sphinx语音识别器库(Link to source)来使用synchronized块.
来自RecognizerTask的一个示例块:
Event mailbox;
[...]
public void start() {
synchronized (this.mailbox) {
this.mailbox.notifyAll();
this.mailbox = Event.START;
}
}
Run Code Online (Sandbox Code Playgroud)
代码工作没有任何问题,但BugFinder提供此警告:
错误:在RecognizerTask.mailbox上进行同步,徒劳地试图保护它
此方法在字段上同步,似乎是试图防止对该字段的同时更新.但是保护一个字段会锁定引用的对象,而不是在字段上.这可能无法提供您需要的互斥,而其他线程可能会在引用的对象上获取锁定(用于其他目的).这种模式的一个例子是:
Run Code Online (Sandbox Code Playgroud)private Long myNtfSeqNbrCounter = new Long(0); private Long getNotificationSequenceNumber() { Long result = null; synchronized(myNtfSeqNbrCounter) { result = new Long(myNtfSeqNbrCounter.longValue() + 1); myNtfSeqNbrCounter = new Long(result.longValue()); } return result; }
说实话,我不太了解错误描述,在这种情况下应该是错误的.全局变量不是字段吗?如果没有,我该如何改进代码呢?
/ edit:这Event.wait()是调用的唯一部分:
Event todo = Event.NONE;
synchronized (this.mailbox) {
todo = this.mailbox;
/* If we're idle then wait …Run Code Online (Sandbox Code Playgroud) 我正在使用加速计,第一个代码是Shake探测器:(Code1)
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
long now = System.currentTimeMillis();
//**********************************************************************
if ((now - mLastForce) > SHAKE_TIMEOUT) {
mShakeCount = 0;
}
if ((now - mLastTime) > TIME_THRESHOLD) {
long diff = now - mLastTime;
float speed = Math.abs(x + y + z - mLastX - mLastY - mLastZ) / diff * 10000;
if (speed > FORCE_THRESHOLD) {
if ((++mShakeCount >= SHAKE_COUNT) && (now - mLastShake > SHAKE_DURATION)) {
mLastShake = now;
mShakeCount = 0;
if …Run Code Online (Sandbox Code Playgroud) 我正在寻找德语发音词典,以便用于PocketSphinx/CMU Sphinx.
字典看起来像这样:
BACK B AE K
CALL K AO L
NO N OW
NUMBER N AH M B ER
ONE W AH N
ONE(2) HH W AH N
REPLY R IH P L AY
REPLY(2) R IY P L AY
SEND S EH N D
STOP S T AA P
THREE TH R IY
TWO T UW
YES Y EH S
Run Code Online (Sandbox Code Playgroud)
找到这些用于英语是没有问题的,但我找不到它们用于德语.你知道在哪里找到它吗?
我有个问题.我需要合并两个不同大小的图片(drawables).这个想法是为某人(动态加载)提供100x100px的图片并且具有更大的透明背景(例如100x120).在最后20个像素中,我有一个箭头,应该指向一个人在地图上的位置.然后我想我可以这样做:
Drawable[] layers = new Drawable[2];
layers[0] = res.getDrawable(R.drawable.background_img);
layers[1] = res.getDrawable(R.drawable.icon);
LayerDrawable layerDrawable = new LayerDrawable(layers);
Run Code Online (Sandbox Code Playgroud)
但这只是将一个图像叠加到另一个图像上而忽略了它们的边界.
感谢Vaidas
- 更新:最后解决了问题.奇迹般有效 :)
private Drawable createPersonDrawable(Bitmap personImage)
{
Bitmap resultingBitmap = Bitmap.createBitmap(drawableWidth,
drawableHeight, Bitmap.Config.ARGB_8888);
Canvas comboCanvas = new Canvas(resultingBitmap);
comboCanvas.drawBitmap(personImage, 0, 0, null);
// Get the bottom part of the image from resources
Bitmap bottomPart = BitmapFactory.decodeResource(getResources(),
R.drawable.person_map_icon_bottom);
comboCanvas.drawBitmap(bottomPart, 0, drawablePersonImageHeight, null);
comboCanvas.save();
return new BitmapDrawable(resultingBitmap);
}
Run Code Online (Sandbox Code Playgroud)
我在这里找到了描述:http://www.jondev.net/articles/Combining_2_Images_in_Android_using_Canvas
我需要从RemoteViews对象中检索一些文本.它可以让我得到LayoutId,但我不知道如何从一个文本TextView是在此RemoteView(即通知).
也是RemoteView唯一包含setter,但没有getter,所以我想我必须使用LayoutId(不知何故).
你能帮帮我吗?谢谢!
/编辑:我之所以这样问,是因为我有一个AccessibilityService检索通知的原因.因此,这是检索值的唯一方法.
/ edit2:我使用此代码接收通知:
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
List<CharSequence> notificationList = event.getText();
for (int i = 0; i < notificationList.size(); i++) {
Toast.makeText(this.getApplicationContext(), notificationList.get(i), 1).show();
}
if (!(parcel instanceof Notification)) {
return;
}
final Notification notification = (Notification) parcel;
doMoreStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
使用该notification对象,我可以访问a RemoteViews(notification.contentView)和a PendingIntent(notification.contentIntent).要获得layoutId,我可以打电话contentView.getLayoutId()
我有一个PreferenceActivity我想动态添加首选项的地方.
长按一下,这些都可以做,但OnPreferenceClickListener只支持普通点击,不需要长时间点击.
有没有办法实现这个功能,我错过了什么?
谢谢
我被困在我的离线 Android 应用程序之一中,在那里我需要离线语音识别和语音到文本 API。
如果有人从事过离线语音到文本和语音识别,请分享您的观点和意见。
我正在尝试创建一个以a开头的类层次结构PreferenceActivity.
想法是基类包含"关于我"按钮,然后下一个类实现游戏/应用程序/壁纸的通用首选项,然后下一个类添加每个实际游戏/应用程序的细节.
这个想法运作良好但是因为我在每个级别添加了来自XML的首选项,所以它们首先出现最通用(最低级别)的首选项(例如我的"关于"按钮).
理想情况下,我希望它们是另一种方式 - 所以特定的首选项出现在列表的顶部,而通用的首选项出现在底部 - 是否有任何方法可以实现这一点(我已经阅读了有关PreferenceFragments的文档和新的PreferenceHeaders,甚至似乎没有提供任何东西?)
是否有任何编程方式在整体顺序中移动PreferenceCategorys或PreferenceScreens ??
基本上当我使用时
addPreferencesFromResource(R.xml.clock_settings);
Run Code Online (Sandbox Code Playgroud)
我想要一个
addPreferencesFromResourceAtBottom(R.xml.clock_settings);
Run Code Online (Sandbox Code Playgroud) 我是Java的新手,我无法弄清楚String[]和之间的区别Array<String>.我如何实际计算一个String[]数组有多少条目?谢谢!
我尝试使用pocketsphinx包为我的应用程序,并需要将演示程序包名称重命名为有用的东西(例如com.myname.foo)
我花了好几个小时搞清楚,但我根本无法让它发挥作用.
问题是,如果我保留包名称并且没有任何问题(除了随机崩溃),项目运行正常,但是当我重命名它时,我得到错误
FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0
Run Code Online (Sandbox Code Playgroud)
我已经尝试过修改Swig命令,但它也没有用.
有任何想法吗?
我只更改了Manifest的包名声明和普通Activity的包文件夹.
我只是想知道,编译器使用什么实际上更有效?
if (condition) {
return something;
} else {
dosomething();
}
Run Code Online (Sandbox Code Playgroud)
要么
if (condition) {
return something;
}
dosomething();
Run Code Online (Sandbox Code Playgroud)
我知道这些是非常低的差异,应该选择更易读的版本,但是我们只能说我们将执行这个代码十亿次,哪一个会更有效?
我也知道在"现实世界"中根本没有任何收获,但我只是好奇.
android ×10
java ×4
cmusphinx ×2
arrays ×1
bluetooth ×1
drawable ×1
merge ×1
offlineapps ×1
performance ×1
permissions ×1
preferences ×1
remoteview ×1
sphinx4 ×1
synchronized ×1
types ×1
widget ×1