2013-03-13 7 views
5

तो मैं अपने ऐप में यूआरएल कहने के लिए कोशिश कर रहा हूं, लेकिन इसके बाद यह खुलता है, यह हमेशा null लगता है कि मैं क्या चाहता हूं कर।एंड्रॉइड यूआरएल योजना: intent.getData() == शून्य (फोनगैप)

<activity android:name="myapp" android:label="@string/app_name" 
      android:theme="@android:style/Theme.Black.NoTitleBar" 
      android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" 
      android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <intent-filter> 
      <data android:scheme="myapp" /> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
     </intent-filter> 

    </activity> 

और यहाँ मेरी जावा है::

यहाँ मेरी प्रकट की प्रासंगिक हिस्सा है

@Override 
public void onStart() { 

    super.onStart(); 
    final Intent intent = getIntent(); 

    Uri url = intent.getData(); 

    Log.e("myLog", "Url = " + url); 

} 

लॉग outputting है "आशय = अशक्त", और मैं कोई त्रुटि है।

मैं जावा डेवलपर नहीं हूं इसलिए मुझे एक साधारण समस्या हो सकती है जिसे मैं पहचान नहीं पा रहा हूं। मैं इसे sendJavascript के साथ अपने फोनगैप ऐप में पास करने जा रहा हूं लेकिन फ़ोनगैप ऐप होने के कारण इस मुद्दे से प्रासंगिक नहीं लगता है।

संपादित करें:

मैं केवल प्रथम <intent-filter> हो रही है जब मैं intent लॉग इन करने लगते हैं। यहाँ लॉग है:

03-13 12:36:18.593: E/MyAppLog(13793): Intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.wd.myapp/.myapp (has extras) } 

समाधान:

कैसे अपने PhoneGap एप्लिकेशन खोलने के लिए यूआरएल योजनाओं को लागू करने के लिए, और उनमें से कोई बहुत मजबूत किया जा रहा है या बिल्कुल भी काम कर रहा पर पदों के दर्जनों के माध्यम से डालने का कार्य करने के बाद, मैं अपना पूरा समाधान पोस्ट करने जा रहा हूं और उम्मीद करता हूं कि किसी को यह उपयोगी लगेगा।

चरण एक: AndroidManifest.xml - यह <intent-filter> अपने <activity> पर जोड़ें, जो भी आप चाहें 'urlScheme' को बदलना। इस मामले में, आप urlScheme: ///? Key = val के लिंक पर क्लिक कर सकते हैं और यह ऐप खोल देगा।

<intent-filter> 
    <data android:scheme="urlScheme" /> 
    <action android:name="android.intent.action.VIEW" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 
</intent-filter> 

चरण दो: myApp.java - निम्नलिखित जोड़े onCreate नीचे। यदि आप singleTask का उपयोग कर रहे हैं, तो फ़ंक्शन (onCreate में, जैसा कि अन्य ने तुरही की है) में intent तर्क डालना सुनिश्चित करें, क्योंकि इससे आप अपने ऐप में लिंक कर सकते हैं चाहे वह पहले से चल रहा है या नहीं।

@Override 
public void onStart() { 

    super.onStart(); 
    final Intent intent = getIntent(); 

    String url = intent.getDataString(); 

    if(url != "" && url != null) { 
     super.sendJavascript("setTimeout(function() { handleOpenURL('" + url + "'); },1);"); 
    }     


} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); setIntent(intent); 
} 

onNewIntent ओवरराइड के लिए स्पष्टीकरण स्वीकार किए जाते हैं उत्तर देखें।

+0

मुझे लगता है कि अंतिम इरादा इरादा = getIntent(); अंतिम इरादा इरादा होना चाहिए = intent.getIntent(); –

+0

कैसा है? 'इरादा' अभी तक मौजूद नहीं है। हालांकि मैं कोशिश करूँगा। – bearfriend

+0

हाँ, यह एक विधि नहीं है। मेरा मानना ​​है कि मैंने 'इरादा' लॉग इन किया है और इससे कुछ मिला है। यह डेटा से बाहर निकलने के लिए बस कॉलिंग विधियों को हमेशा शून्य है। – bearfriend

उत्तर

14

onNewIntent ओवरराइड करने का प्रयास करें। समस्या यह है कि getIntentIntent लौटाता है जिसने Activity शुरू किया, लेकिन सबसे हालिया नहीं। लेकिन आप इसे setIntent विधि का उपयोग कर ओवरराइड कर सकते हैं।

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    setIntent(intent); 
} 
+0

धन्यवाद एक आकर्षण की तरह काम करता है। मेरे समाधान पर केवल एक चीज है जो मुझे करना है। जैसे ही मैं एक नई गतिविधि लॉन्च कर रहा था, मेरी मुख्य गतिविधि से गतिविधिZ, मेरी ऑनस्टार्ट विधि में। लेकिन जब भी मैं मुख्य गतिविधि पर वापस आ जाता हूं, तब भी यह हो रहा था कि यह फिर से गतिविधि जेड लॉन्च करता है, इसलिए मैंने जो किया वह स्पष्ट रूप से इच्छित डेटा को शून्य पर सेट कर रहा है। – cocoaNoob

0

मूल उत्तर का विस्तार, यदि आपकी मुख्य गतिविधि एक और गतिविधि शुरू करती है। फिर यह लॉन्च गतिविधि से मुख्य गतिविधि पर वापस आने के बाद बार-बार गतिविधि को लॉन्च करने की अनंत लूप को समाप्त कर सकता है।

यहाँ कोड

public void onStart(){ 
     super.onStart(); 
     Intent intent = getIntent(); 
     Uri data = intent.getData(); 
     if (data != null) { 
      // explicitly set intent data to null 
      // so on next launch, from same lifecycle of activity 
      // it does not restart the Activity Z. 
      intent.setData(null); 
      Intent activityZ = new Intent(MyActivity.this, ActivityZ.class); 
       businessViewActivity.putExtra("url", data.toString()); 
       startActivity(activityZ); 
     } 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     setIntent(intent); 
    } 

आशा है कि यह मदद करता है।

+0

आपको एंड्रॉइड सेट करने की आवश्यकता है: launchMode = "singleTask" आपके AndroidManifest.xml में गतिविधि पर (प्रश्न में कोड देखें) – jackocnr

संबंधित मुद्दे