2012-06-18 13 views
13

IMEを実装しているAndroidアプリケーションで作業中にEclipseワークスペースログに表示されるエラーを理解して解決しようとしています。私はAndroidとEclipseの初心者です。Android - サポートされていないサービス:音声

エラーは、「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) 太陽の下でjava.lang.reflect.Constructor.newInstanceでsun.reflect.DelegatingConstructorAccessorImpl.newInstance(不明 出典)で sun.reflect.NativeConstructorAccessorImpl.newInstance(不明なソース) で.reflect.NativeConstructorAccessorImpl.newInstance0(ネイティブ 方法)(不明出所) com.android.ide.eclipse.adt.internal.editors.layoutで com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java:402) で 。 ProjectCallback.loadView(ProjectCallback.java:166) at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207) at android.view.BridgeInflater.createViewF (LayoutInflater.java:376)android.view.LayoutInflater.inflate(LayoutInflater.java:466) でromTag(BridgeInflater.java:135) android.view.LayoutInflater.inflate(LayoutInflater.java:372) com.android.layoutlib.bridgeにあります。 .RenderSessionImpl.inflate(RenderSessionImpl.java:321) at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:324) at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary .java:325) at com.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) at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1115) at com.android.ide.eclipse.adt.internal.editors.layout。 com.android.ideでgle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:941) でcom.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.delegatePageChange(LayoutEditorDelegate.java:450) 。 org.eclipse.uiで org.eclipse.ui.part.MultiPageEditorPart.setActivePage(MultiPageEditorPart.java:1067) でeclipse.adt.internal.editors.common.CommonXmlEditor.pageChange(CommonXmlEditor.java:358) 。 forms.editor.FormEditor.setActivePage(フォーム com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.selectDefaultPage(AndroidXmlEditor.java:380) com.android.ide.eclipse.adt.internal.editorsで でEditor.java:607) 。 AndroidXmlEditor.addPages(AndroidXmlEditor.java:285) ( )com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor。 org.eclipse.ui.part.MultiPageEditorPart.createPartControl(MultiPageEditorPart.javaで org.eclipse.ui.forms.editor.FormEditor.createPages(FormEditor.java:138) でaddPages(CommonXmlEditor.java:283) 。 348) でorg.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465) org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:670) でorg.eclipseで.inf。 org.eclipse.ui.internal.WorkbenchPageで(WorkbenchPage.java:2945) でorg.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2850) clipse.ui.internal.WorkbenchPage.busyOpenEditorBatched。アクセス$ 11の(WorkbenchPage.java:2842) org.eclipse.swt.custom.BusyIndi​​cator.showWhileで org.eclipse.ui.internal.WorkbenchPage $ 10.run(WorkbenchPage.java:2793) (BusyIndi​​cator.javaで: 70) org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2789) でorg.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2773) でorg.eで(IDE.java:651) org.eclipse.ui.ide.IDE.openEditor() org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditorで org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:355) でIDE.java:610)(EditorUtility .java:164) at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:249)at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:228)at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:275) at 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 :ORGで org.eclipse.jface.viewers.StructuredViewer $ 2.run(StructuredViewer.java:866) で org.eclipse.ui.OpenAndLinkWithEditorHelper $ InternalListener.open(OpenAndLinkWithEditorHelper.java:48) で538) 。 eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)at org.eclipse.ui.internal.JFaceUtil $ 1.run(JFaceUtil.java:49)at org.eclipse.jface.util.SafeRunnable.run (SafeRunnable.java:175)at org.eclips e.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:864) でorg.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1152) org.eclipse.jface.viewers.StructuredViewer $ 6位の.handleOpen(StructuredViewer.java:1256) でorg.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:275) OpenStrategy.java(2 org.eclipse.jface.util.OpenStrategy.access $ で: org.eclipse.jface.util.OpenStrategy $ 1.handleEvent(OpenStrategy.java:309) atorg.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse。 swt.widgets.Widget.sendEvent(ウィジェット。Javaの:1053) org.eclipseでorg.eclipse.swt.widgets.Display.readAndDispatchで org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) (Display.java:3754) で.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)at org.eclipse.ui.internal.Workbench $ 7.run(Workbench.java:679)at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) at org.eclipse.ui.PlatformUI.crea でteAndRunWorkbench(PlatformUI.java:149) org.eclipse.equinox.internal.app.EclipseAppHandle.runでorg.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123) ( org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.startで org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) でEclipseAppHandle.java:196) ( EclipseAppLauncher.java:79) でorg.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.javaで: 179) java.lang.reflect.Method.invoke(で sun.reflect.DelegatingMethodAccessorImpl.invoke(不明なソース)で sun.reflect.NativeMethodAccessorImpl.invoke(不明なソース)でsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で、不明なソース) org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)at org.eclipse.equinox org.eclipse.equinox.launcher.Main.main(Main.java:1386)

で.launcher.Main.run(Main.java:1410)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は、" エラーのスタックトレースに表示される文字列 "オーディオ"、のように見えます。

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コードの一部です。

このエラーがなぜ発生しているのか、それを回避する方法を理解していただきたいと思っています。

+0

私は同じ問題に直面しています。この問題を解決した場合はお知らせください。ここに私の質問です。 [http://stackoverflow.com/questions/13884677/android-custom-keyboard-the-following-classes-could-not-be-instantiated] –

答えて

4

API 14以降を使用していますか?もしそうなら、それは問題です。私はそれがそのバージョンのバグだと思う。 API 11では動作します。

API 11を試してみるには、getResources()メソッドをオーバーライドする必要があります。詳細についてはthisをご確認ください。その後、これは動作します。

実際には、あなたは確かにスーパーのViewのコンストラクタを呼び出さなければならないので、isInEditMode()を使用することはできないので、API 14(またはそれ以上)のLatinKeyboardViewからジャンプする方法はないと思います。そして、そのコンストラクタは、私はあなたがEclipseのグラフィカルエディタ(実際に私は私のカスタムビューをレイアウトエディタのレイアウトに配置しようとしたときにこのエラーが発生したと思うので、単に失敗するオーディオシステムサービスを取得しようとします)

私はこれをハックする唯一の方法は、getSystemServiceなしで独自のKeyboardViewを実装することだと思います。 isInEditMode == trueの場合、そのメソッドを呼び出さないでください。

+0

他の理由から、私はアプリケーションからキーボードを削除したので、これはもはや私の問題ではなく、別のキーボードを実装しようとするともう一度やり直すことができます。 – Ian

4

これは失敗したコードはレイアウト編集中にオーディオマネージャを取得してスキップするisInEditMode()チェックに包まれるべき

public KeyboardView(Context context, AttributeSet attrs, int defStyle) { 
... 
    mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
... 
} 

あるandroid.inputmethodservice.KeyboardView

のバグです。奇妙ですが、私はAndroidのバグトラッカーで報告された問題を見つけることができません!

2

解決策が見つかりました。

public class KeyboardViewFix extends KeyboardView { 
    public static boolean inEditMode = true; 

    @TargetApi(21) // Build.VERSION_CODES.L 
    public KeyboardViewFix(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(inEditMode ? new ContextWrapperInner(context) : context, attrs, defStyleAttr, defStyleRes); 
    } 

    public KeyboardViewFix(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(inEditMode ? new ContextWrapperInner(context) : context, attrs, defStyleAttr); 
    } 

    public KeyboardViewFix(Context context, AttributeSet attrs) { 
     super(inEditMode ? new ContextWrapperInner(context) : context, attrs); 
    } 

    public static class ContextWrapperInner extends ContextWrapper { 
     Context base; 
     public ContextWrapperInner(Context base) { 
      super(base); 
      this.base = base; 
     } 
     public Object getSystemService(String name) { 
      return Context.AUDIO_SERVICE.equals(name) ? null : base.getSystemService(name); 
     }  
    } 
} 

ワンノート:あなたはKeyboardViewFix.inEditMode = false;を設定したり、いくつかのエラーを取得することができます必要がある他のコードの前に、あなたのアプリケーションを起動するにはKeyboardViewを置き換えるよう

使用KeyboardViewFix

+0

こんにちは@Enyby、私はあなたのソリューションを使用しましたが、それを改善して編集してください(私の新しい回答では)。 – SRombauts

+0

@SRombautsあなたが正しいです。このコードは間違っており、問題が発生します。特に、6アンドロイド。 ContextWrapperはこの目的のために使用する必要があります。自宅で私は訂正し、忘れてしまった。 – Enyby

1

@Enyvyによって、Context(はるかに少ないコード)ではなくContextWrapperを拡張して解決策を改善しました。 は、「オーディオ」を求めるために禁止されたのgetService()メソッドを除いて、基本コンテキストへのすべてのメソッドの代表団とのContextWrapperクラスを使用します:

public class ContextWrapperFix extends ContextWrapper { 
    private boolean editMode; 

    public ContextWrapperFix(Context context, boolean editMode) { 
     super(context); 
     this.editMode = editMode; 
    } 

    public Object getSystemService(String name) { 
     if (editMode && Context.AUDIO_SERVICE.equals(name)) { 
      return null; 
     } 
     return super.getSystemService(name); 
    } 
} 

次のステップは、独自のクラスを作成しているKeyboardViewを拡張:

public class KeyboardViewFix extends KeyboardView { 
    public static boolean inEditMode = true; 

    @TargetApi(21) // Build.VERSION_CODES.L 
    public KeyboardViewFix(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(new ContextWrapperFix(context, inEditMode), attrs, defStyleAttr, defStyleRes); 
    } 

    public KeyboardViewFix(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(new ContextWrapperFix(context, inEditMode), attrs, defStyleAttr); 
    } 

    public KeyboardViewFix(Context context, AttributeSet attrs) { 
     super(new ContextWrapperFix(context, inEditMode), attrs); 
    } 

} 

KeyboardViewの代わりにKeyboardViewFixを使用してください。

ワンノート:あなたのアプリを起動するときに、他のコードを入力する前にKeyboardViewFix.inEditMode = false;に設定するか、エラーが発生することがあります。

+0

カスタムキーボードでpopupKeyboardを使用している場合は、ポップアップの閉じるボタンをタップするとNullPointerExceptionが発生します。 – tagy22

0

これまで私はこの問題を抱えていましたが、今はAndroid Studio 3.0.1にアップデートしましたが、これ以上再生できません(これはしばらく前にこのプロジェクトを開いていない可能性があります) 。私はAS3で試してみました

2つの構成:

minSdkVersion 10, compileSdkVersion 26, support library 25.4.0 
minSdkVersion 14, compileSdkVersion 26, support library 27.0.2 

のAndroid Studioのプレビューペインがどのように動作するかの変化は、おそらくありました。

関連する問題