11

मेरे पास एक एंड्रॉइड सेवा है जो माइक्रोफोन इनपुट के लिए चल रही है और सुन रही है। मैं चाहता हूं कि यह एक निश्चित मानदंड पूरा होने पर एक गतिविधि शुरू करे। एक इरादा बनाने के लिए मुझे आवेदन संदर्भ की आवश्यकता है। मैं इसे कैसे प्राप्त कर सकता हूँ?मैं एंड्रॉइड सेवा से एप्लिकेशन संदर्भ कैसे प्राप्त कर सकता हूं?

Intent i = new Intent(ctx, SONR.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
ctx.startActivity(i); 

उपर्युक्त रेखा मेरी गतिविधि शुरू नहीं करती है।

यहाँ मेरी निर्माता

public SONRClient(Context c, AudioRecord ar, int buffsize, final AudioManager am) { 
    theAudioManager = am; 
    theaudiorecord = ar; 
    bufferSize = buffsize; 
    ctx = c; 
    CLIENT_ON = true; 
} 

है यहाँ मेरी onCreate

@Override 
public void onCreate() { 
    try { 
     // LogFile.MakeLog("\n\nSONRClient CREATED"); 
     clientStopReceiver = new StopReceiver(); 
     ctx.registerReceiver(clientStopReceiver, 
      new IntentFilter(SONR.DISCONNECT_ACTION)); 
     myByteReceiver = new SONRByteReceiver(); 
     theListener = new MicSerialListener(
      theaudiorecord, bufferSize, myByteReceiver); 
     theApplication = getApplication(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     ErrorReporter.getInstance().handleException(e); 
    } 
} 

वहाँ myByteReceiver है कि ऑडियो इनपुट के माध्यम से संकेतों के लिए सुन रहा है है। जब यह एक मिलान सिग्नल पाता है, तो मैं इसे एक गतिविधि लॉन्च करना चाहता हूं।

private class SONRByteReceiver implements ByteReceiver { 
    private long lastplaytime = 0; 
    private long lastmutetime = 0; 
    private long lastskiptime = 0; 
    private long lastvolutime = 0; 
    private long lastbacktime = 0; 

    public void receiveByte(int receivedByte) { 
     try { 
      theKeyEvent = -1; 

      if (ismuted) { 
       if (receivedByte != MUTE) { 
        volume = 0; 
        ismuted = false; 
       } 
      } 

      switch (receivedByte) { 

      case SONR_HOME: 
       Log.d(TAG, "HOME"); 

       Intent i = new Intent(ctx, SONR.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       theApplication.startActivity(i); 

       break; 
      default: 
       Log.d(TAG, "default"); 
       Log.d(TAG,"RECEIVED " + receivedByte); 
       // LogFile.MakeLog("RECEIVED " + receivedByte); 
       break; 
      } 

      if (theKeyEvent >= 0) { 
       sendbroadcast(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      ErrorReporter.getInstance().handleException(e); 
     } 
    } 
} 

यहाँ स्टैकट्रेस

java.lang.NullPointerException 
    at com.sonrlabs.test.sonr.SONRClient$SONRByteReceiver.receiveByte(SONRClient.java:320) 
    at com.sonrlabs.test.sonr.AudioProcessor.processSample(AudioProcessor.java:145) 
    at com.sonrlabs.test.sonr.AudioProcessor.run(AudioProcessor.java:58) 

लाइन 320 है theApplication.startActivity(i);

+1

आप विधि आप में 'getApplicationContext' फोन पोस्ट किया जा सका उपयोग करने के लिए करते हैं? – Craigy

+0

मैंने इसे –

+0

पोस्ट किया है यदि आप NullPointerException के लॉग को पोस्ट करते हैं तो यह अधिक उपयोगी होगा। – keno

उत्तर

0
ctx.getApplicationContext().startActivity(i) 

उछाल।

+0

सीटीएक्स क्या है ?? क्या आप उपरोक्त निर्देश सेवा से लॉन्च करते हैं? – Lisitso

+0

@ लिसीट्सो 'सीटीएक्स' एक' संदर्भ 'चर – Houssni

+1

है यदि आपके पास पहले से ही संदर्भ के रूप में सीटीएक्स है तो आवेदन संदर्भ क्यों प्राप्त करें और फिर सक्रियता शुरू करें? क्यों नहीं ctx.startActivity()? – Ishaan

4

है आप अपनी सेवा के अंदर getApplicationContext() उपयोग कर सकते हैं आवेदन संदर्भ मिलता है।

getApplication().startActivity(i); 

android start activity from service

+1

जब मैं getplicationContext() –

+0

कोशिश करता हूं तो मुझे एक शून्य सूचक अपवाद मिलता है मैंने अपना कोड अपडेट किया। मेरे पास संदर्भ का संदर्भ है, लेकिन मेरी गतिविधि दिखाई नहीं दे रही है। क्या मुझसे कुछ गलत हो रही है? –

+0

मुझे getAplication() –

1

का उपयोग कर आप दावा है कि आप एक आवेदन संदर्भ की जरूरत है शुरू करने के लिए एक गतिविधि गलत है कर रहे हैं की कोशिश। आप सेवा सहित start an activity from any context कर सकते हैं, जो एक संदर्भ है।

+0

'के लिए अभी भी एक nullpointerexception प्राप्त करने का प्रयास करें मैंने इसे केवल प्रारंभिकता (), मैं अभी भी एक nullpointerexception मिलता है। अधिक कोड –

+0

के साथ अद्यतन प्रश्न शून्य सूचक के लिए स्टैक ट्रैक दिखाएं। यदि आप उस वर्ग के भीतर से इसका उपयोग कर रहे हैं तो यह एक शून्य सेवा की वजह से नहीं है। – dhaag23

+0

प्रश्न में स्टैकट्रैक वह सब कुछ है जो डिबगिंग करते समय मुद्रित होता है। आगे डीबग करने के तरीके पर कोई विचार? –

2

बदलें इस:

Intent i = new Intent(ctx, SONR.class); 

रहे हैं:

Intent i = new Intent(getApplicationContext(),SONR.class); 
+0

जिसके परिणामस्वरूप nullpointerexception –

+0

असंभव है, आपको कहीं और शून्य सूचक अपवाद मिल रहा है। यदि आपकी सेवा चल रही है तो संदर्भ शून्य नहीं हो सकता है। – Rohit

+0

स्टैकट्रैस ऐसा नहीं कहता है। –

1

getBaseContext() जो हर गतिविधि के बाद से संदर्भ रिटर्न प्रसंग वर्ग फैली

3

हर सेवा के लिए अपने स्वयं प्रसंग है, बस का उपयोग करें कि। आपको सेवा को एक गतिविधि का संदर्भ पास करने की आवश्यकता नहीं है।

सेवा में गतिविधि संदर्भ की कोई आवश्यकता नहीं है।

Intent i = new Intent(ctx, SONR.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(i); 

, बस के रूप में आप गतिविधि में

सेवा करते हैं और गतिविधि दोनों प्रसंग के उपवर्गों रहे हैं।

1

आपको अपने सार्वजनिक खाली कन्स्ट्रक्टर के अंदर getApplicationContext() पर कॉल नहीं करना चाहिए, या यह आपको NullPointerException देगा।

+0

'सेवा' कक्षा में 'getAplicationContext() 'को कॉल करने के लिए एक सुरक्षित स्थान है? – JJD

+0

@JJD getAplicationContext() को कॉल न करें, विश्रेंड एंड्रॉइड डेवलपर के रूप में GetBaseContext() प्राप्त करने के लिए कॉल करें। – russellhoff

+0

फिर भी सवाल यह है कि किस विधि में इसे सुरक्षित करना सुरक्षित है। – JJD

0

बस इस सेवा संदर्भ

Intent i = new Intent(Service.this, SONR.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(i);