小编For*_*rce的帖子

startBluetoothSco()在ICS上抛出安全异常(BROADCAST_STICKY)

我有一个由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并不重要.

permissions android bluetooth

7
推荐指数
1
解决办法
1990
查看次数

无法从窗口小部件SendIntentException发送待处理的意图

我想使用以下代码从我的小部件发送广播:

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)

android widget android-intent android-pendingintent

6
推荐指数
2
解决办法
4844
查看次数

多线程正确性:使用同步块

我正在使用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上进行同步,徒劳地试图保护它

此方法在字段上同步,似乎是试图防止对该字段的同时更新.但是保护一个字段会锁定引用的对象,而不是在字段上.这可能无法提供您需要的互斥,而其他线程可能会在引用的对象上获取锁定(用于其他目的).这种模式的一个例子是:

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;
 }
Run Code Online (Sandbox Code Playgroud)

说实话,我不太了解错误描述,在这种情况下应该是错误的.全局变量不是字段吗?如果没有,我该如何改进代码呢?

/ 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)

java multithreading android synchronized

6
推荐指数
1
解决办法
3211
查看次数

如何同时运行两个FOR循环

我正在使用加速计,第一个代码是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)

java android

5
推荐指数
1
解决办法
8381
查看次数

德语发音词典CMU Sphinx

我正在寻找德语发音词典,以便用于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)

找到这些用于英语是没有问题的,但我找不到它们用于德语.你知道在哪里找到它吗?

sphinx4 cmusphinx

5
推荐指数
1
解决办法
2476
查看次数

地图:合并多个不同大小的drawable

我有个问题.我需要合并两个不同大小的图片(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

merge android drawable

5
推荐指数
1
解决办法
2151
查看次数

从RemoteViews对象中检索文本

我需要从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()

android remoteview

5
推荐指数
2
解决办法
7117
查看次数

如何在Preference中添加"长按侦听器"?

我有一个PreferenceActivity我想动态添加首选项的地方.

长按一下,这些都可以做,但OnPreferenceClickListener只支持普通点击,不需要长时间点击.

有没有办法实现这个功能,我错过了什么?

谢谢

android preferenceactivity android-preferences

4
推荐指数
1
解决办法
5859
查看次数

Android:语音转文本和语音识别离线

我被困在我的离线 Android 应用程序之一中,在那里我需要离线语音识别和语音到文本 API。

如果有人从事过离线语音到文本和语音识别,请分享您的观点和意见。

android speech-to-text voice-recognition offlineapps

3
推荐指数
1
解决办法
4627
查看次数

Android首选项 - 更改它们的显示顺序

我正在尝试创建一个以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)

android preferences

2
推荐指数
1
解决办法
2237
查看次数

String []和Array <String>之间的区别

我是Java的新手,我无法弄清楚String[]和之间的区别Array<String>.我如何实际计算一个String[]数组有多少条目?谢谢!

java arrays types

1
推荐指数
2
解决办法
1669
查看次数

更改包名称会破坏JNI

我尝试使用pocketsphinx包为我的应用程序,并需要将演示程序包名称重命名为有用的东西(例如com.myname.foo)

我花了好几个小时搞清楚,但我根本无法让它发挥作用.

问题是,如果我保留包名称并且没有任何问题(除了随机崩溃),项目运行正常,但是当我重命名它时,我得到错误

FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0
Run Code Online (Sandbox Code Playgroud)

我已经尝试过修改Swig命令,但它也没有用.

有任何想法吗?

我只更改了Manifest的包名声明和普通Activity的包文件夹.

java-native-interface android cmusphinx

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

什么在java中会更有效率?If-return-else或If-return?

我只是想知道,编译器使用什么实际上更有效

if (condition) {
    return something;
} else {
    dosomething();      
}
Run Code Online (Sandbox Code Playgroud)

要么

if (condition) {
    return something;
}
dosomething();
Run Code Online (Sandbox Code Playgroud)

我知道这些是非常低的差异,应该选择更易读的版本,但是我们只能说我们将执行这个代码十亿次,哪一个会更有效?

我也知道在"现实世界"中根本没有任何收获,但我只是好奇.

java performance

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