2012-06-18 18 views
13

मैं एक आईईएम लागू करने वाले एंड्रॉइड ऐप पर काम करते हुए ग्रहण कार्यक्षेत्र लॉग में देख रहा हूं और समझने और त्रुटि करने की कोशिश कर रहा हूं। मैं एंड्रॉइड और ग्रहण के लिए नया हूँ।एंड्रॉइड - असमर्थित सेवा: ऑडियो

त्रुटि "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) पर सूरज पर .reflect.NativeConstructorAccessorImpl.newInstance0 java.lang.reflect.Constructor.newInstance पर sun.reflect.DelegatingConstructorAccessorImpl.newInstance (अज्ञात स्रोत) पर sun.reflect.NativeConstructorAccessorImpl.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) atroid.view.BridgeInflater.loadCustomView (BridgeInflater.java:207) atroid.view.BridgeInflater.createViewF romTag (BridgeInflater.java:135) atroid.view.LayoutInflater.inflate (LayoutInflater.java:466) atroid.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.create सत्र (लेआउट लाइब्रेरी .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 (फॉर्म Editor.java:607) com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.selectDefaultPage (AndroidXmlEditor.java:380) com.android.ide.eclipse.adt.internal.editors पर पर। AndroidXmlEditor.addPages (AndroidXmlEditor.java6585) 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.e पर clipse.ui.internal.WorkbenchPage.busyOpenEditorBatched (WorkbenchPage.java:2945) org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor (WorkbenchPage.java:2850) org.eclipse.ui.internal.WorkbenchPage पर पर। पहुँच $ 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.e पर पर clipse.ui.internal.WorkbenchPage.openEditor (WorkbenchPage.java72764) org.eclipse.ui.ide.IDE.openEditor (IDE.java:651) org.eclipse.ui.ide.IDE.openEditor पर ( org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor (EditorUtility.java:355) पर IDE.java:610) org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor पर (EditorUtility .java: 164) org.eclipse.jdt.ui.actions.OpenAction.run (OpenAction.java3949) org.eclipse.jdt.ui.actions.OpenAction.run (OpenAction.java2828) पर org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun (SelectionDispatchAction.javas75) org.eclipse.jdt.ui.actions.electionDispatchAction.run (SelectionDispatchAction.rava: 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.ui.internal.JFace पर org.eclipse.jface.util.SafeRunnable.run (SafeRunnable.java:175) 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) पर पर 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 (विजेट।जावा: 1053) org.eclipse पर org.eclipse.swt.widgets.Display.runDeferredEvents (Display.java:4165) org.eclipse.swt.widgets.Display.readAndDispatch (Display.java:3754 पर) पर .ui.internal.Workbench.runEventLoop (Workbench.java:2701) org.eclipse.ui.internal.orkbench.runUI (Workbench.java:2665) org.eclipse.ui.internal.Workbench.access $ 4 (वर्कबेंच.जावा 4 9 4 9 0) 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.crea पर teAndRunWorkbench (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.run पर (EclipseStarter.java पर: 17 9) पर sun.reflect.NativeMethodAccessorImpl.invoke0 (मूल विधि) 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:5277) org.eclipse.equinox पर .launcher.Main.run org.eclipse.equinox.launcher.Main.main (Main.java:1386) पर (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 "सुपर (संदर्भ, 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 } 

क्या मैं विशेष रूप से इस दिनचर्या में puzzling लगता है कि मैं नहीं दिख रहा है कि यह कैसे कभी "ऑडियो" सेवा संभाल सकता है, फिर भी BridgeContext.java है और KeyboardView.java एंड्रॉइड कोड का हिस्सा हैं, न कि कक्षाएं जिन्हें मैंने गलत लिखा है।

कोई भी पॉइंटर्स मुझे यह समझने में मदद करने के लिए कि यह त्रुटि क्यों हो रही है और इससे कैसे बचें, इसकी सराहना की जाएगी।

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है। अगर आपने इस समस्या का समाधान किया है तो कृपया मुझे बताएं। मेरा सवाल यहाँ है। [Http://stackoverflow.com/questions/13884677/android-custom-keyboard-the-following-classes-could-not-be-instantiated] –

उत्तर

4

क्या आप एपीआई 14 या उच्चतर का उपयोग कर रहे हैं? यदि ऐसा है तो समस्या है। मुझे लगता है कि यह उस संस्करण में एक बग है। एपीआई 11 में यह काम करता है।

यदि आप एपीआई 11 का प्रयास करते हैं तो आपको getResources() विधि को ओवरराइड करने के साथ कुछ हैक करना होगा।अधिक जानकारी के लिए this देखें। इसके बाद यह काम करेगा।

असल में मुझे लगता है कि एपीआई 14 (या शायद उच्च) पर अपने लैटिनकेबोर्ड व्यू से इसे कूदने का कोई तरीका नहीं है क्योंकि आप isInEditMode() का भी उपयोग नहीं कर सकते हैं क्योंकि आपको निश्चित रूप से सुपर के साथ व्यू कन्स्ट्रक्टर का आह्वान करना होगा। और वह कन्स्ट्रक्टर ऑडियो सिस्टम सेवा प्राप्त करने का प्रयास करेगा जो बस असफल हो जाता है क्योंकि मुझे लगता है कि आप इसे ग्रहण ग्राफिकल संपादक में चलाने की कोशिश करते हैं (असल में मुझे यह त्रुटि मिली जब मैंने अपने कस्टम व्यू को गैस्ट्रिकल लेआउट एडिटर में लेआउट में रखने की कोशिश की)

मुझे लगता है कि इसे हैक करने का एकमात्र तरीका getSystemService के बिना अपने स्वयं के कीबोर्ड दृश्य को लागू करना है। हो सकता है कि उस विधि को कॉल न करें अगर INEDitMode == सत्य है।

+0

अन्य कारणों के लिए, मैं आवेदन से कीबोर्ड को हटा दिया है, तो यह है अब मेरे लिए कोई मुद्दा नहीं है, लेकिन अगर मैं एक और कीबोर्ड लागू करने का प्रयास करता हूं तो फिर से हो सकता है - मार्गदर्शन के लिए धन्यवाद। – Ian

4

यह android.inputmethodservice.KeyboardView

में एक बग में नाकाम रहने कोड

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

यह isInEditMode() जांच लेआउट संपादन के दौरान ऑडियो प्रबंधक हो रही छोड़ में लिपटे किया जाना चाहिए है। अजीब लेकिन मुझे एंड्रॉइड बग ट्रैकर में कोई समस्या नहीं मिली है!

2

मुझे समाधान मिला।

उपयोग KeyboardViewFix रूप 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(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; सेट की जरूरत है या आप कुछ त्रुटियाँ प्राप्त कर सकते हैं।

+0

हाय @ एनी, मैंने आपके समाधान का उपयोग किया, लेकिन कृपया इसे निम्नलिखित सुधार के साथ संपादित करें (मेरे नए उत्तर में)। – SRombauts

+0

@SRombauts आप सही हैं। यह कोड गलत है और समस्याएं पैदा करेगा। विशेष रूप से, 6 एंड्रॉइड। ContextWrapper इस उद्देश्य के लिए उपयोग करने की आवश्यकता है। घर पर मैंने सही किया, और फिर भूल गया। – Enyby

1

मैंने कॉन्टेक्स्ट (बहुत कम कोड) के बजाय ContextWrapper को विस्तारित करके @Enyvy द्वारा समाधान में सुधार किया। , आधार संदर्भ के लिए सभी तरीकों के प्रतिनिधिमंडल के साथ ContextWrapper वर्ग का उपयोग करता है विधि getService() कि "ऑडियो" के लिए पूछने के लिए न करे है के लिए छोड़कर:

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.inEditMode = false; सेट की जरूरत से पहले, अपने अनुप्रयोग शुरू करने या आप कुछ त्रुटियाँ प्राप्त कर सकते हैं।

+0

यदि आप अपने कस्टम कीबोर्ड के साथ पॉपअपकेबोर्ड का उपयोग कर रहे हैं, तो पॉप अप पर बंद बटन टैप करने से NullPointerException का कारण बनता है। – tagy22

0

मुझे अतीत में यह समस्या आई है, अब मैंने एंड्रॉइड स्टूडियो 3.0.1 में अपडेट किया है और मैं अब और पुन: पेश नहीं कर सकता (शायद बहुत समय पहले तय किया गया हो, मैंने थोड़ी देर के लिए इस परियोजना को नहीं खोल दिया) ।

दो विन्यास मैं AS3 के साथ करने की कोशिश की:

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

संभवतः कैसे एंड्रॉयड स्टूडियो की पूर्वावलोकन फलक काम करता है में एक परिवर्तन किया गया था।