我正在尝试理解并解决在Android应用程序中实现输入法时在Eclipse工作区日志中看到的错误。我对Android和Eclipse都很陌生。
错误信息是"com.utterkaos.keyboard.LatinKeyboardView无法实例化"。
相关的堆栈跟踪如下:
java.lang.UnsupportedOperationException: 不支持的服务:音频 在com.android.layoutlib.bridge.android.BridgeContext.getSystemService(BridgeContext.java:434) android.inputmethodservice.KeyboardView.(KeyboardView.java:376) android.inputmethodservice.KeyboardView.(KeyboardView.java:279) com.utterkaos.keyboard.LatinKeyboardView.(LatinKeyboardView.java:30) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) java.lang.reflect.Constructor.newInstance(Unknown Source) com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java:402) com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(ProjectCallback.java:166) android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207) android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:135) android.view.LayoutInflater.inflate(LayoutInflater.java:466) android.view.LayoutInflater.inflate(LayoutInflater.java:372) com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:321) com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:324) com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:325) com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:372) com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1361) com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1115) com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:941) com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.delegatePageChange(LayoutEditorDelegate.java:450) com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor.pageChange(CommonXmlEditor.java:358) org.eclipse.ui.part.MultiPageEditorPart.setActivePage(MultiPageEditorPart.java:1067) org.eclipse.ui.forms.editor.FormEditor.setActivePage(FormEditor.java:607) com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.selectDefaultPage(AndroidXmlEditor.java:380) com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.addPages(AndroidXmlEditor.java:285) com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor.addPages(CommonXmlEditor.java:283) org.eclipse.ui.forms.editor.FormEditor.createPages(FormEditor.java:138) org.eclipse.ui.part.MultiPageEditorPart.createPartControl(MultiPageEditorPart.java:348) org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:670) org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465) org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595) org.eclipse.ui.internal.EditorReference.getEditor(EditorReference.java:289) org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2945) org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2850) org.eclipse.ui.internal.WorkbenchPage.access$11(WorkbenchPage.java:2842) org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:2793) org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2789) org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2773) org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2764) org.eclipse.ui.ide.IDE.openEditor(IDE.java:651) org.eclipse.ui.ide.IDE.openEditor(IDE.java:610) org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:355) org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:164) org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:249) org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:228) org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:275) org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:251) org.eclipse.jdt.internal.ui.packageview.PackageExplorerActionGroup.handleOpen(PackageExplorerActionGroup.java:376) org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$4.open(PackageExplorerPart.java:538LatinKeyboardView.java相关部分如下:
public class LatinKeyboardView extends KeyboardView {
static final int KEYCODE_OPTIONS = -100;
public LatinKeyboardView(Context context, AttributeSet attrs) {
super(context, attrs);
}
第30行是"super(context, attrs);"。
查看KeyboardView.java文件,第376行:
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
这里的"Context.AUDIO_SERVICE"似乎是字符串"audio",出现在错误堆栈跟踪中。
BridgeContext.java中相关的部分如下:
public Object getSystemService(String service) {
414 if (LAYOUT_INFLATER_SERVICE.equals(service)) {
415 return mBridgeInflater;
416 }
417
418 if (TEXT_SERVICES_MANAGER_SERVICE.equals(service)) {
419 // we need to return a valid service to avoid NPE
420 return TextServicesManager.getInstance();
421 }
422
423 // AutoCompleteTextView and MultiAutoCompleteTextView want a window
424 // service. We don't have any but it's not worth an exception.
425 if (WINDOW_SERVICE.equals(service)) {
426 return null;
427 }
428
429 // needed by SearchView
430 if (INPUT_METHOD_SERVICE.equals(service)) {
431 return null;
432 }
433
434 throw new UnsupportedOperationException("Unsupported Service: " + service);
435 }
我在这个例程中特别困惑的是,我不明白它怎么可能处理“音频”服务,但BridgeContext.java和KeyboardView.java都是Android代码的一部分,而不是我错误编写的类。
如果有任何指针可以帮助我理解为什么会发生这种错误以及如何避免它,那将不胜感激。