- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Android/Glass 开发的新手,但我首先要解决似乎非常具有挑战性的任务。我正在尝试通过蓝牙向 Glass 和我的计算机发送字符串消息。
我有一个用于蓝牙功能的服务,并且我有一个嵌套在该服务中的绑定(bind)器类。然而,当我尝试调用 Binder 的方法之一时,应用程序崩溃了。
崩溃发生在这一行:
mBluetoothService.requestConnect();
导致此错误:
java.lang.NoClassDefFoundError: com.riverlab.glassbluetooth.BluetoothService$RemoteConnectionBinder
运行此代码:
MainActivity.java:处理菜单项
package com.riverlab.glassbluetooth;
import com.example.glassbluetooth.R;
import com.keyboardr.glassremote.client.RemoteMessenger;
import com.keyboardr.glassremote.client.RemoteMessengerService;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
private boolean mResumed;
private GlassBluetoothService.MainBinder mService;
private BluetoothService.RemoteConnectionBinder mBluetoothService;
//Name is deceptive, this binder is for the voice control
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName arg0, IBinder binderService) {
if(binderService instanceof GlassBluetoothService.MainBinder) {
mService = (GlassBluetoothService.MainBinder) binderService;
openOptionsMenu();
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};
//Connection for the bluetooth binder
private ServiceConnection mBluetoothConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName arg0, IBinder binderService) {
if(binderService instanceof RemoteMessengerService.RemoteConnectionBinder){
mBluetoothService = (BluetoothService.RemoteConnectionBinder) binderService;
openOptionsMenu();
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(mService == null) {
bindService(new Intent(this, GlassBluetoothService.class), mConnection, 0);
}
if (mBluetoothService == null)
{
bindService(new Intent(this, BluetoothService.class), mBluetoothConnection, 0);
}
}
@Override
protected void onResume() {
super.onResume();
mResumed = true;
}
@Override
protected void onPause() {
super.onPause();
mResumed = false;
}
@Override
public void openOptionsMenu() {
if (mResumed && mService != null) {
super.openOptionsMenu();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public void onDestroy() {
super.onDestroy();
finish();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.read_connection_status:
mService.speakConnectionStatus();
finish();
return true;
case R.id.connect:
mBluetoothService.requestConnect();
finish();
return true;
case R.id.stop:
stopService(new Intent(this, GlassBluetoothService.class));
stopService(new Intent(this, BluetoothService.class));
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onOptionsMenuClosed(Menu menu) {
super.onOptionsMenuClosed(menu);
unbindService(mConnection);
}
}
BluetoothService.java:处理蓝牙
package com.riverlab.glassbluetooth;
import java.util.UUID;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.speech.tts.TextToSpeech;
import com.example.glassbluetooth.R;
import com.keyboardr.glassremote.client.RemoteMessenger;
import com.keyboardr.glassremote.client.RemoteMessengerImpl;
import com.keyboardr.glassremote.client.StringRemoteMessengerService;
import com.keyboardr.glassremote.client.RemoteMessenger.Callback;
import com.keyboardr.glassremote.client.RemoteMessengerService.RemoteConnectionBinder;
import com.keyboardr.glassremote.common.receiver.MessageReceiver;
import com.keyboardr.glassremote.common.receiver.StringMessageReader;
import com.keyboardr.glassremote.common.sender.MessageSender;
import com.keyboardr.glassremote.common.sender.StringMessageSender;
public class BluetoothService extends Service
{
private final RemoteConnectionBinder mBinder = new RemoteConnectionBinder();
private RemoteMessenger<String, String> mMessenger;
public class RemoteConnectionBinder extends Binder implements
RemoteMessenger<String, String> {
@Override
public void setCallback(Callback<? super String> callback) {
mMessenger.setCallback(callback);
}
@Override
public boolean isConnected() {
return mMessenger.isConnected();
}
@Override
public void requestConnect() {
mMessenger.requestConnect();
}
@Override
public void disconnect() {
mMessenger.disconnect();
}
@Override
public void sendMessage(String arg0) throws IllegalStateException {
// TODO Auto-generated method stub
}
}
public void onCreate()
{
super.onCreate();
mMessenger = new RemoteMessengerImpl<String, String>(UUID.randomUUID(), new StringMessageSender(), new StringMessageReader());
}
public void onStartCommand()
{
mMessenger.requestConnect();
while (!mMessenger.isConnected());
mMessenger.sendMessage("Connection Succesful");
}
@Override
public void onDestroy() {
mMessenger.disconnect();
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
mMessenger.setCallback(null);
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
mMessenger.setCallback(null);
mMessenger.disconnect();
return super.onUnbind(intent);
}
}
这两个文件位于同一个包中。我在构建路径中添加了三个 jar 文件,它们似乎与该问题无关,但请让我知道这是否会导致问题。我在 Ubuntu 12.04 上使用 Eclipse ADT 版本:v22.3.0-887826
预先感谢您的帮助!我实在想不通这个问题。
编辑:这是 RemoteMessenger
package com.keyboardr.glassremote.client;
import java.lang.ref.WeakReference;
import java.util.UUID;
import android.bluetooth.BluetoothDevice;
import com.keyboardr.glassremote.common.receiver.MessageReceiver;
import com.keyboardr.glassremote.common.receiver.StringMessageReader;
import com.keyboardr.glassremote.common.sender.MessageSender;
import com.keyboardr.glassremote.common.sender.StringMessageSender;
/**
* Interface for communicating with the remote server. There should be a
* <code>MessageService<R, S></code> running on that remote server.
*
* @author Joshua Brown
*
* @param <S>
* the type of messages this <code>RemoteMessenger</code> will send
* to the remote server. The corresponding
* <code>MessageService</code> on the remote server should receive
* messages as <code>S</code> or some superclass thereof.
* @param <R>
* the type of messages this <code>RemoteMessenger</code> will
* receive from the remote server. The corresponding
* <code>MessageService</code> on the remote server should send
* messages as <code>R</code> or some subclass thereof.
*/
public interface RemoteMessenger<S, R> {
/**
* Callback interface for <code>RemoteMessenger</code>. All callbacks will
* be called on the main thread.
*
* @param <M>
* message type to receive
*/
public static interface Callback<M> {
/**
* The <code>RemoteMessenger</code> has connected to
* <code>remoteDevice</code> and is able to send and receive messages
*
* @param remoteDevice
* the <code>BluetoothDevice</code> this
* <code>RemoteMessenger</code> has connected to
*/
public void onConnected(BluetoothDevice remoteDevice);
/**
* The <code>RemoteMessenger</code> has failed to connect to any
* devices. Messages cannot be sent or received
*/
public void onConnectionFailed();
/**
* The <code>RemoteMessenger</code> has disconnected from
* <code>remoteDevice</code> and can no longer send or receive messages
*
* @param remoteDevice
* the <code>BluetoothDevice</code> this
* <code>RemoteMessenger</code> was connected to
*/
public void onDisconnected(BluetoothDevice remoteDevice);
/**
* The <code>RemoteMessenger</code> has received a message from the
* remote server
*
* @param message
* the <code>M</code> message received from the remote server
*/
public void onReceiveMessage(M message);
}
/**
* Sets callback destination. Implementations should use
* {@link WeakReference WeakReferences} to ensure the
* <code>RemoteMessenger</code> does not inadvertently keep the
* <code>Callback</code> from being GCed
*
* @param callback
*/
public void setCallback(Callback<? super R> callback);
/**
* Checks if this <code>RemoteMessenger</code> is connected to a remote
* server
*
* @return <code>true</code> iff this <code>RemoteMessenger</code> can send
* and receive messages from a remote server
*/
public boolean isConnected();
/**
* Attempts to connect to a remote server. Calls
* {@link Callback#onConnected(BluetoothDevice) onConnected()} callback if
* successful or {@link Callback#onConnectionFailed() onConnectionFailed()}
* if unsuccessful
*/
public void requestConnect();
/**
* Disconnects from the remote server. Calls
* {@link Callback#onDisconnected(BluetoothDevice) onDisconnected()} when
* finished
*/
public void disconnect();
/**
* Sends a <code>S</code> message to the remote server. May be called from
* the main thread
*
* @param message
* the <code>S</code> message to send
* @throws IllegalStateException
* If the <code>RemoteMessenger</code> is not connected
*/
public void sendMessage(S message) throws IllegalStateException;
public static class Factory {
private Factory() {
}
/**
* Gets an instance of <code>RemoteMessenger</code> that sends and
* receives <code>String</code> messages<br/>
* <br/>
* <b>Note:</b> Messages are separated by <code>'\n'</code> characters
*
* @param uuid
* a <code>UUID</code> shared between the remote server and
* this client. UUIDs can be obtained at <a
* href="http://www.uuidgenerator.net/">http
* ://www.uuidgenerator.net/</a> and instantiated using
* {@link UUID#fromString(String)}.
* @return a <code>RemoteMessenger</code> that sends and receives
* <code>String</code> messages
*/
public static RemoteMessenger<String, String> getStringRemoteMessenger(
UUID uuid) {
return new RemoteMessengerImpl<String, String>(uuid,
new StringMessageSender(), new StringMessageReader());
}
/**
* Get an instance of <code>RemoteMessenger</code> that sends
* <code>S</code> and receives <code>R</code> messages
*
* @param uuid
* a <code>UUID</code> shared between the remote server and
* this client. UUIDs can be obtained at <a
* href="http://www.uuidgenerator.net/">http
* ://www.uuidgenerator.net/</a> and instantiated using
* {@link UUID#fromString(String)}.
* @param sender
* the <code>MessageSender</code> providing the
* implementation for sending <code>S</code> messages
* @param receiver
* the <code>MessageReceiver</code> providing the
* implementation for receiving <code>R</code> messages
*/
public static <S, R> RemoteMessenger<S, R> getRemoteMessenger(
UUID uuid, MessageSender<S> sender, MessageReceiver<R> receiver) {
return new RemoteMessengerImpl<S, R>(uuid, sender, receiver);
}
}
}
最佳答案
As far as how I added them, I right clicked on my project, selected Build Path, Add External Archive, and then I selected my jars
这不是将 JAR 添加到 Android 项目的方式。请撤消该操作,然后在项目中创建一个 libs/
目录(如果尚不存在),然后将 JAR 复制到 libs/
中。这不仅会自动将它们添加到编译时构建路径中,而且还会将它们的内容打包到 APK 文件中。您的方法解决了编译时构建路径问题,但 JAR 未打包在 APK 中,并且在运行时不可用。
关于java - 嵌套在 Service 类中的 Binder 类出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713652/
我正在使用 choronos,它建议使用 start/stop 命令开始停止,如下所示 开始计时 停止计时 但是,我正在编写 puppet manifest,它只适用于下面的服务命令。 服务计时开始
来历及作用 services.exe进程程序文件是由微软公司为其发布的Windows操作系统定义的一个系统进程,常见于Windows 2000/XP/Vista/2007等系统中,被描述为服务和控
我一直在尝试使用installutil:installutil /u GSIS.FileMoverService.exe安装Windows服务。 我得到的输出是: Uninstalling assem
如果一个域有多个团队和多个 Web 应用程序,那么注册 Service Worker 来管理整个站点的最佳建议是什么?具有范围的顶级服务 worker /或子域中的多个服务 worker ?由于一个域
我已经在 eclipse 中创建了企业项目。动态web项目和ejb项目对企业项目有借鉴意义。当我运行管理员(企业项目)运行时选择 wildfly 服务器 18。我收到以下错误。谁能告诉我我错过了什么。
我已经使用 apache-cxf-2.7.4 创建了一个 Web 服务。我进入了我的项目中制作的类(class)。我的项目中的库是: math3-commons-3.2.jar XStream-1.4
我在域中的 Virtual Box 中运行集群计算机,默认情况下服务在 Network 服务下运行,服务一直停止,事件日志中出现以下错误。 请从下面的错误日志中查找错误详细信息。任何帮助都会很棒。 L
在我的应用程序中,用户可以在 map 上发布事件。应用程序的入口点是一个无状态的 web api 服务。为了在内部代表用户,我想要一个用户服务。我应该何时使用 Reliable Stateful Ac
当我尝试运行在WIX中创建的安装程序时,出现以下错误消息: “服务'Report Generator Service'(报告生成器服务)无法启动。请验证您是否具有启动系统服务的足够特权”。 我已经在这
尝试使用 cloudformation 创建 ECS 服务(在 Fargate 上)但出现错误: Invalid service in ARN (Service: AmazonECS; Status
我正在编写一个简单的Windows服务,该服务每个月向所有员工发送一封电子邮件。我的问题是,完成后如何停止自我?我是该领域的新手,请帮帮我。非常感谢。 它将部署在服务器上以每月运行。我没有开始做这件事
有谁知道是否有办法在 service worker 中获取此号码或日期: 将我的服务 worker 缓存命名为 cache-1182 会很方便或 cache-20171127171448 我想在安装事
我想开始使用 Azure Service Fabric 技术。 我按照this document工作并安装最新的SDK。安装后,我打开 PowerShell(“以管理员身份运行”)命令行窗口并写入这些
我在使用 whenever gem 时遇到了一些问题。我创建了一个 rake 任务,当我自己启动它时它工作得很好但是当我在日志中收到以下消息时尝试自动执行它: ActiveRecord::Statem
我想在 service fabric 集群中为两个不同的 web 应用程序(webpi/website)共享 http/80 端口,应用程序必须有 2 个不同的主机名: mywebapi.com 和
我创建了一个使用 MongoDB 实现 hibernate OGM 的应用程序。它在 Eclipse 中运行得很好,但是,当我构建一个 fat jar 并尝试运行它时,出现以下错误: Exceptio
我有一个 Selenium Python 测试套件。它开始运行,但几分钟后抛出以下错误: Exception AttributeError: "'Service' object has no attr
我按照此链接的说明进行操作:https://www.thegeekdiary.com/centos-rhel-7-how-to-make-custom-script-to-run-automatica
我在 ubuntu 下的 jboss 上部署了简单的“HelloWorld”Web 服务。 我创建了简单的客户端,但我无法让它工作。每次运行客户端时,我都会收到 NullPointerExceptio
我正在尝试为我的网站使用后台定期同步。我正在使用 localhost 并在 1*1000 毫秒时注册 periodicsync 事件,但这根本不会触发。 我看过这个demo ,但即使我将该网站安装为应
我是一名优秀的程序员,十分优秀!