Ian*_*Ian 13 audio android ime
我正在尝试理解和解决我在Eclipse工作区日志中看到的错误,同时处理实现IME的Android应用程序.我是Android和Eclipse的新手.
错误是"com.utterkaos.keyboard.LatinKeyboardView无法实例化".
关联的堆栈跟踪是:
java.lang.UnsupportedOperationException:不支持的服务:位于android.inputmethodservice的android.inputmethodservice.KeyboardView(KeyboardView.java:376)的com.android.layoutlib.bridge.android.BridgeContext.getSystemService(BridgeContext.java:434)中的音频. KeyboardView.(KeyboardView.java:279)at com.utterkaos.keyboard.LatinKeyboardView.(LatinKeyboardView.java:30)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)at at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)at java.lang.reflect.Constructor.newInstance(Unknown Source)at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java: 402)在android.view.BridgeInflater的android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207)的com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(ProjectCallback.java:166) .createViewFromTag(BridgeI nflater.java:135)在android.view.LayoutInflater.inflate(LayoutInflater.java:466)的android.view.LayoutInflater.inflate(LayoutInflater.java:372)at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate (RenderSessionImpl.java:321)com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:324)位于com的com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:325). android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:372)at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart .java:1361)位于com.android.ide.eclipse.adt.internal.editors.layout的com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1115) .gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:941)位于com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.delegatePageChange(LayoutEditorDeleg)ate.java:450)位于org.eclipse.ui.part.MultiPageEditorPart.setActivePage(MultiPageEditorPart.java)的com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor.pageChange(CommonXmlEditor.java:358) 1067)在com的com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.selectDefaultPage(AndroidXmlEditor.java:380)的org.eclipse.ui.forms.editor.FormEditor.setActivePage(FormEditor.java:607) .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.ui.Editor.AdditorReference上的org.eclipse.ui.forms.editor.FormEditor.createPages(FormEditor.java:138)org.eclipse.ui.part.MultiPageEditorPart.createPartControl(MultiPageEditorPart.java:348) .createPartHelper(EditorReference.java:670)位于org.eclipse.ui.internal.WorkbenchPartReference.getPart(Workbe)的org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465)nchPartReference.java:595)org.eclipse.ui.Uternal中的org.eclipse.ui.internal.Editor.Reference.getEditor(EditorReference.java:289)org.eclipse.工作台上的org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2945)位于org.eclipse.ui.internal.WorkbenchPage $ 10.run(WorkbenchPage.java :org.eclipse.Swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)org.eclipse.ui.Uternal中的org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2789)org.eclipse.ui.internal. org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2764)上的org.eclipse.ui.ide.IDE.openEditor(IDE.java:651)中的WorkbenchPage.openEditor(WorkbenchPage.java:2773)位于org.eclipse.jdt.internal.ui的org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:355)的.eclipse.ui.ide.IDE.openEditor(IDE.java:610) .javaeditor.EditorUtility.openInEditor(EditorUt ility.java:164)org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:249)org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:228)org位于org.eclipse.jdt.internal.ui的org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:251)的.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:275) .packageview.PackageExplorerActionGroup.handleOpen(PackageExplorerActionGroup.java:376)atg.eclipse.jdt.internal.ui.packageview.PackageExplorerPart $ 4.open(PackageExplorerPart.java:538)org.eclipse.ui.OpenAndLinkWithEditorHelper $ InternalListener.open( OpenAndLinkWithEditorHelper.java:48)在org.eclipse的org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)的org.eclipse.jface.viewers.StructuredViewer $ 2.run(StructuredViewer.java:866). ui.internal.JFaceUtil $ 1.run(JFaceUtil.java:49)org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredVi)ewer.java:864)在org.eclipse上的org.eclipse.jer上的org.eclipse.jer.j上的org.eclipse.tructersView.handleOpen(StructuredViewer.java:1152)org.eclipse. jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:275)atg.eclipse.jface.util.OpenStrategy.access $ 2(OpenStrategy.java:269)org.eclipse.jface.util.OpenStrategy $ 1.handleEvent(OpenStrategy. java:309)org.eclipse.swt.wtt.EndTable.sendEvent(EventTable.java:84)atg.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)org.eclipse.swt.widgets .Display.runDeferredEvents(Display.java:4165)位于org.eclipse.wt.ui.Worky.RunEventLoop(Workbench.java:2701)的org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665)org.eclipse.ui.internal.Workbench.access $ 4(Workbench.java:2499)org.eclipse.ui.internal.Workbench $ 7.在org.eclipse.core.databinding.observable.Realm.runW上运行(Workbench.java:679)ithDefault(Realm.java:332)位于org.eclipse.ui的org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)的org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) .internal.ide.application.IDEApplication.start(IDEApplication.java:123)位于org.eclipse.core.runtime.internal.adaptor的org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) .EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)位于org.eclipse.core.runtime.adaptor.EclipseStarter.run上的org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)(EclipseStarter) .java:344)atg.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)在org.eclipse.equinox.launcher.Main.in的java.lang.reflect.Method.invoke(未知来源)的sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在org.eclipse上的org.eclipse.equinox.launcher.Main.run(Main.java:1410)的org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)上的vokeFramework(Main.java:622) .equinox.launcher.Main.main(Main.java:1386)
LatinKeyboardView.java的相关部分是:
public class LatinKeyboardView extends KeyboardView {
static final int KEYCODE_OPTIONS = -100;
public LatinKeyboardView(Context context, AttributeSet attrs) {
super(context, attrs);
}
Run Code Online (Sandbox Code Playgroud)
第30行是"超级(背景,激情);"
看看KeyboardView.java,第376行:
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
Run Code Online (Sandbox Code Playgroud)
这里"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 }
Run Code Online (Sandbox Code Playgroud)
我觉得在这个例程中特别令人费解的是我没有看到它如何处理"音频"服务,但是BridgeContext.java和KeyboardView.java都是Android代码的一部分,而不是我编写错误的类.
任何指示,以帮助我理解为什么会发生此错误以及如何避免它将非常感激.
您使用的是 API 14 或更高版本吗?如果是这样那就是问题所在。我猜这是该版本的一个错误。在 API 11 中它可以工作。
如果您尝试 API 11,则必须通过重写 getResources() 方法进行一些修改。检查此以获取更多信息。在此之后它将起作用。
实际上我认为没有办法从 API 14(或更高版本)上的 LatinKeyboardView 跳过这个,因为你甚至不能使用 isInEditMode() 因为你肯定必须使用 super 调用视图的构造函数。并且该构造函数将尝试获取音频系统服务,该服务只是失败了,因为我猜您尝试在 Eclipse 图形编辑器中运行它(实际上,当我尝试将自定义视图放入图形布局编辑器中的布局时,我收到了此错误)
我认为解决这个问题的唯一方法是在没有 getSystemService 的情况下实现您自己的 KeyboardView。如果 isInEditMode == true ,也许不应该调用该方法。
归档时间: |
|
查看次数: |
2959 次 |
最近记录: |