2012-09-06 40 views
8

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

पहले आवेदन (सर्वर), प्रकट निम्नलिखित है:

<application android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" android:theme="@style/AppTheme"> 
    <activity android:name="edu.example.sharing.manager.SecureFileShare" 
     android:label="@string/title_activity_secure_file_share" android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="edu.example.sharing.action.STORE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="*/*" /> 
     </intent-filter> 
    </activity> 
</application> 

दूसरा आवेदन इस प्रकार को कोई लक्ष्य बनाता है:

File f = new File(s); 
Uri fileUri = Uri.fromFile(f); 
Intent intent = new Intent(); 
intent.setData(fileUri); 
intent.setAction("edu.example.sharing.action.STORE");    
startActivityForResult(intent, STORE_REQUEST); 

इसकी प्रकट सामान्य है। जब मैं क्लाइंट अनुप्रयोग में आशय भेजने का प्रयास करें, फिर भी, मैं एक गतिविधि नहीं मिला अपवाद:

FATAL EXCEPTION: main 
android.content.ActivityNotFoundException: No Activity found to handle Intent {act=edu.example.sharing.action.STORE dat=file:///storage/sdcard0/Download/Alarcon12-Rigoberto.pdf } 
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1545) 
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416) 
at android.app.Activity.startActivityForResult(Activity.java:3351) 
at android.app.Activity.startActivityForResult(Activity.java:3312) 

क्या एंड्रॉयड दूसरा आवेदन में घोषित गतिविधि को पहचानते नहीं करने के लिए पैदा कर रहा है? धन्यवाद।

+0

मैनिफेस्ट में 'फ़ाइलस्टोर' गतिविधि में निर्यात की गई विशेषता डालने का प्रयास करें। – Varun

+0

मेरे लिए भी कभी-कभी यह काम करता है जब मैं 'setAction()' का उपयोग करके कार्रवाई सेट कर रहा था, लेकिन फिर मैंने कार्रवाई को सेट करने के लिए 'इरादा' कन्स्ट्रक्टर का उपयोग करने के लिए स्विच किया, पूर्व: 'नया इरादा ("edu.example, manager। action.STORE ");' – Varun

+0

अपनी पैकेज आईडी से मेल खाने के लिए अपनी कार्रवाई को बदलने का प्रयास करें, इसलिए edu.example.manager.action.STORE edu.example.manager.FileStore.action.STORE –

उत्तर

0

सबसे पहले आप केवल यह निर्दिष्ट कर सकते हैं कि कौन सा एप्लिकेशन जाना है; आप निर्दिष्ट नहीं कर सकते कि किस avtivity पर जाना है; मैंने पहले ही जवाब दिया है कि किसी अन्य ऐप पर नेविगेट कैसे करें here; उसके बाद आपका नियंत्रण दूसरे ऐप पर जाता है; तुम वहाँ इसे संभाल करने के लिए

+1

यह वास्तव में सच नहीं है। एक अंतर्निहित इरादा किसी गतिविधि, ब्रॉडकास्ट रिसीवर या सेवा को मैप कर सकता है। –

+1

मैं जाने के लिए कोई गतिविधि चुनने की कोशिश नहीं कर रहा हूं - मैं एक _implicit_ इरादा भेजने की कोशिश कर रहा हूं जिसके कारण एंड्रॉइड का चयन करना चाहिए कि कौन से एप्लिकेशन इसे संभाल सकते हैं। आपके द्वारा लिंक किया गया उत्तर नाम से एप्लिकेशन खोलने के लिए संदर्भित करता है। – skoke

6

ज्यादा देखने के बाद है, यहाँ मैं क्या पाया है:

जब आप एक निर्मित कार्रवाई प्रकार का उपयोग करें और एक डेटा क्षेत्र या देते हैं जब आप एक कस्टम क्रिया का उपयोग कोई डेटा फ़ील्ड टाइप करें, intent-filterdata तत्व के बिना ठीक है।

हालांकि, जब आप कस्टम कार्रवाई को परिभाषित करते हैं और डेटा फ़ील्ड शामिल करते हैं, तो आपको यूआरआई संलग्न करने के लिए मैन्युअल रूप से mime-type सेट करना होगा। Android documentation का दावा है कि

आम तौर पर प्रकार डेटा से अनुमानित होता है। इस विशेषता को सेट करके, आप उस मूल्यांकन को अक्षम करते हैं और एक स्पष्ट प्रकार को मजबूर करते हैं।

लेकिन ऐसा नहीं है। जब मैं एक file:// यूआरआई जो .txt में समाप्त हो गया में डाल दिया, एंड्रॉयड यह एक अशक्त mime-type सौंपा, इसलिए यह एक data और */*mime-type साथ किसी भीintent-filter, यहां तक ​​कि एक से मेल नहीं होता। मुझे setDataAndType() का उपयोग करके मैन्युअल रूप से इरादे के प्रकार को सेट करने की आवश्यकता थी।

कम में: आप मैन्युअल को परिभाषित करना होगा एक आशय की mime-type जब डेटा के साथ एक कस्टम क्रिया का उपयोग कर।

+0

हम इरादे फ़िल्टर कार्रवाई नाम में कस्टम नामों का उपयोग कर सकते हैं उदा। हमारे ऐप में से एक में ऐप 1 कहता है। और ऐप 2 से इसे इरादा I = नया इरादा ("my_intent") कहते हैं? –

+0

@ फ़ारज़ अहमद, हाँ हम कर सकते हैं। – Liangjun