2012-06-22 9 views
8

मेरे पास एक टेक्स्ट रीडर ऐप है जिसे एंड्रॉइड सिस्टम से इरादा प्राप्त करने के लिए डिज़ाइन किया गया है जब मैं इसे खोलने के लिए टेक्स्ट फ़ाइल पर क्लिक करता हूं। लेकिन मेरा ऐप सिस्टम द्वारा पॉप अप सूची में नहीं है।txt फ़ाइल खोलने के लिए ऐप्स की सूची में मेरा ऐप क्यों नहीं है?

प्रकट

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.broadcastreceivertest1" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="8" /> 

<application 
android:icon="@drawable/ic_launcher" 
android:label="@string/app_name" > 
<activity 
android:label="@string/app_name" 
android:name=".BroadcastReceiverTest1Activity" > 
<intent-filter > 
<action android:name="android.intent.action.MAIN" /> 

<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 

<receiver android:name="MyBroadcastReceiver"> 
<intent-filter> 
<action android:name="android.intent.action.ACTION_VIEW" /> 
<action android:name="android.intent.action.ACTION_EDIT" /> 
<action android:name="android.intent.action.ACTION_PICK" /> 
<data android:scheme="file" /> 
<data android:mimeType="*/*" /> 
<data android:pathPattern=".*\\.txt" />  
<data android:host="*" /> 
</intent-filter> 
</receiver> 

</application> 

</manifest> 

मेरे विस्तारित BroadcastReceiver

public final class MyBroadcastReceiver extends BroadcastReceiver { 
private String TAG = "MyBroadcastReceiver"; 

@Override 
public void onReceive(Context context, Intent intent) { 
// TODO Auto-generated method stub 
Intent i = new Intent(context, BroadcastReceiverTest1Activity.class); 
i.putExtra("URI", intent.getData()); 
context.startActivity(i); 
Log.d(TAG, "Leaving onReceived..."); 
} 
} 

मेरे गतिविधि प्रसारण रिसीवर

public class BroadcastReceiverTest1Activity extends Activity { 

private String uri =""; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
final Intent intent = getIntent(); 

final String action = intent.getAction(); 

if(Intent.ACTION_VIEW.equals(action)){ 
uri = intent.getStringExtra("URI"); 
TextView textView = (TextView)findViewById(R.id.textView); 
textView.setText(uri); 

} 

} 
} 

धन्यवाद द्वारा खोले जाने के लिए: नीचे मेरी कोड कर रहे हैं!

उत्तर

12

आपको अपने ऐप को फ़ाइल एक्सटेंशन से जोड़ना होगा। ऐसा करने के लिए, लक्ष्य फ़िल्टर के भीतर इन दो लाइन जोड़ सकते हैं और u'r अच्छा

<data android:scheme="file" /> 
<data android:mimeType="*/*"/> 
<data android:pathPattern=".*\\.pdf" /> 

जाना और अपने मेनिफ़ेस्ट की तरह लग रहे हो जाएगा इस

<activity name="com.your.activity"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:scheme="file" /> 
     <data android:mimeType="*/*" /> 
     <data android:pathPattern=".*\\.txt" /> 
    </intent-filter> 
</activity> 

<data android:scheme="file" /> => इस को परिभाषित है कि फ़ाइल होना चाहिए स्थानीय, नहीं से http वरना

<data android:mimeType="*/*" /> => किसी भी माइम प्रकार से मेल

<data android:pathPattern=".*\\.txt" /> => इस जहाँ आप क्या ई निर्दिष्ट है XTension आप

आशा इस मदद

+0

मैं बस अपने ऐप को टेक्स्ट फाइल खोलने की सूची में रखना चाहता हूं, लेकिन अब मेरा ऐप हर प्रकार की फाइलों के लिए सूची में है। मेरे पास <डेटा एंड्रॉइड था: pathPattern = "। * \\। Txt" />, लेकिन मुझे आश्चर्य है कि मुझे माइम टाइप निर्दिष्ट करना चाहिए। मेरे ऐप को केवल टेक्स्ट फ़ाइलों को खोलने की सूची में दिखने के लिए मुझे क्या करना चाहिए? –

+2

माइम प्रकार को '<डेटा एंड्रॉइड में बदलें: mimeType = "text/plain" /> ' – Hein

+0

धन्यवाद! यह बहुत अच्छा काम किया! –

3

आपको एक फ़िल्टर पंजीकृत करना है जो फिल्टर गुणों के साथ प्रसारण रिसीवर नहीं है।

+0

धन्यवाद! मैं समझ गया कि। –

6

नायक के छद्म कोड पर व्याख्या मिलान करना चाहते हैं, यह प्रभावी रूप से काम करता है:

परिवर्तन <manifest> इस तरह:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.broadcastreceivertest1" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="9" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:label="@string/app_name" 
      android:name=".BroadcastReceiverTest1Activity" > 
      <intent-filter > 

       <action android:name="android.intent.action.VIEW" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.BROWSABLE" /> 
       <data android:scheme="file" /> 
       <data android:mimeType="*/*" /> 
       <data android:pathPattern=".*\\.txt" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

अपने प्रसारण रिसीवर ड्रॉप, क्योंकि यह अनावश्यक है।

परिवर्तन आपके BroadcastReceiverTest1Activity वर्ग (यह अपने मुख्य गतिविधि होने की जरूरत नहीं, नीचे दिए गए बोनस देख करता है):

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 
public class BroadcastReceiverTest1Activity extends Activity { 
    private String TAG = "TagOpenTxt"; 
    private String uri =""; 
    private Uri uri2; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     final Intent intent = getIntent(); 
     final String action = intent.getAction(); 

     if(Intent.ACTION_VIEW.equals(action)){ 
      //uri = intent.getStringExtra("URI"); 
      uri2 = intent.getData(); 
      uri = uri2.getEncodedPath() + " complete: " + uri2.toString(); 
      TextView textView = (TextView)findViewById(R.id.textView); 
      textView.setText(uri); 
      // now you call whatever function your app uses 
      // to consume the txt file whose location you now know 
     } else { 
      Log.d(TAG, "intent was something else: "+action); 
     } 
    } 
} 

आप प्रभावी रूप से बनाया है TXT के लिए एक आशय श्रोता फ़ाइलें, जो कॉल करेंगे अपने ऐप अगर उपयोगकर्ता इसका उपयोग करने का निर्णय लेता है (जब तक कि उपयोगकर्ता ने पहले किसी अन्य ऐप से फ़ाइल प्रकार TXT को संबद्ध नहीं किया है ...)

आपका ऐप को इरादे को पकड़ने के लिए सक्रिय होने की आवश्यकता नहीं है। एक बार स्थापित होने पर, सिस्टम इसे आपके द्वारा चुने गए विशेष माइम प्रकारों और/या एक्सटेंशन (माइम प्रकार से संबद्ध करने से कम आसान) के लिए "गोटो ऐप्स" में से एक के रूप में पहचानता है।

बोनस: आप एक अलग मुख्य गतिविधि हो सकता है और जब आपके BroadcastReceiver कहा जाता है, यह आपके आवेदन के रूप में ही सैंडबॉक्स भीतर निष्पादित करेगा, यह प्रभावित किए बिना (आप लागू करने के लिए है कि अपने मुख्य गतिविधि के onResume विधि में होगा) ।

आप पाठ डेटा स्थिर चर (रों) में पढ़ सकते हैं [लापरवाही] या आप एक SQLite डाटाबेस, जो स्थायी और सुरक्षित है, ऐप और/या फोन की परवाह किए बिना में रख सकते हैं उदाहरण के लिए, बंद करना।

आप गतिविधि को आत्मनिर्भर कर सकते हैं और लेआउट/विंडो को कभी भी फायर नहीं कर सकते - जो कि आपके उपयोगकर्ता को किसी प्रकार की पुष्टि चाहिए कि txt फ़ाइल सही ढंग से और पूरी तरह से ऐप द्वारा उपभोग की गई है।

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