Android — неподдерживаемая служба: звук

Я пытаюсь понять и устранить ошибку, которую я вижу в журнале рабочей области Eclipse, работая над приложением Android, которое реализует IME. Я новичок в Android и Eclipse.

] Ошибка «com.utterkaos.keyboard.LatinKeyboardView не удалось создать экземпляр».

Связанная трассировка стека:

java.lang.UnsupportedOperationException: Unsupported Service: audio в 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) at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance (неизвестный источник) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance (неизвестно Источник) в java.lang.reflect.Constructor.newInstance (неизвестный источник) в 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.внутренний.WorkbenchPage$10.run(WorkbenchPage.java:2793) в org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) в org.eclipse.ui.внутренний.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:538) в org.eclipse.ui.OpenAndLinkWithEditorHelper$InternalListener.open(OpenAndLinkWithEditorHelper.java:48) в org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:866) на org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) на org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49) по адресу org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) по адресу org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:864) в org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1152) в орг.eclipse.jface.viewers.StructuredViewer$6.handleOpen(StructuredViewer.java:1256) в org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:275) в org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:269) в org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:309) в org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) в org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) в org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) на org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) в org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701) на 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.run(Workbench.java:679) в org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) в org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) в org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) в org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123) в org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) в org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) в org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) в org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) в org.eclipse.core.runtime.adaptor.EclipseStarter.запустить (EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke(неизвестный источник) в java.lang.reflect.Method.invoke (неизвестный источник) в org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) по адресу org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) в org.eclipse.equinox.launcher.Main.run(Main.java:1410) по адресу org.eclipse.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);

}

Строка 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, а не классы, которые я написал неправильно.

Будем очень признательны за любые подсказки, которые помогут мне понять, почему возникает эта ошибка и как ее избежать.

13
задан Ian 18 June 2012 в 20:34
поделиться