2012-06-22 23 views
8

Tôi có ứng dụng đọc văn bản được thiết kế để nhận ý định từ hệ thống Android khi tôi nhấp vào tệp văn bản để mở tệp. Nhưng ứng dụng của tôi không có trong danh sách được hệ thống hiển thị. Dưới đây là mã của tôi:Tại sao ứng dụng của tôi không nằm trong danh sách ứng dụng để mở tệp txt?

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" /> 

<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 mở rộng My

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..."); 
} 
} 

hoạt động của tôi sẽ được mở bằng cách thu phát sóng

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); 

} 

} 
} 

Cảm ơn!

Trả lời

12

Bạn cần liên kết ứng dụng của mình với tiện ích mở rộng tệp. Để làm như vậy, thêm hai dòng này trong vòng lọc ý và u'r tốt để đi

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

Và bạn manifest sẽ trông như thế này

<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" /> => này xác định rằng tập tin phải được địa phương, chứ không phải từ http hoặc khác

<data android:mimeType="*/*" /> => phù hợp với bất kỳ loại mime

<data android:pathPattern=".*\\.txt" /> => đây là nơi bạn chỉ định những gì e XTENSION bạn muốn kết hợp

Hy vọng điều này giúp đỡ

+0

Tôi chỉ muốn ứng dụng của mình nằm trong danh sách mở tệp văn bản, nhưng hiện tại ứng dụng của tôi nằm trong danh sách cho mọi loại tệp. Tôi đã có , nhưng tôi tự hỏi nếu tôi nên chỉ định mimeType. Tôi nên làm gì để hạn chế ứng dụng của mình chỉ xuất hiện trong danh sách mở tệp văn bản? –

+2

thay đổi loại mime thành '' – Hein

+0

Cảm ơn bạn! Nó hoạt động rất tốt! –

3

Bạn phải đăng ký ACTIVITY không phải là bộ thu phát sóng có thuộc tính bộ lọc.

+0

cảm ơn! Tôi hiểu điều đó. –

6

xây dựng trên mã giả HERO, điều này làm việc một cách hiệu quả:

thay đổi các <manifest> như thế này:

<?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> 

thả broadcast receiver của bạn, bởi vì nó là không cần thiết.

thay đổi lớp BroadcastReceiverTest1Activity của bạn (nó KHÔNG cần phải được hoạt động chính của bạn, xem BONUS bên dưới):

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); 
     } 
    } 
} 

bạn đã có hiệu quả tạo ra một nghe ý định cho TXT file, mà sẽ gọi bạn ứng dụng NẾU người dùng quyết định sử dụng nó (trừ khi người dùng trước đây đã liên kết TXT loại tệp với một ứng dụng khác ...)

ứng dụng của bạn không KHÔNG cần phải hoạt động để bắt ý định. sau khi cài đặt, hệ thống nhận ra nó là một trong những "ứng dụng goto" cho các loại mime cụ thể và/hoặc phần mở rộng (ít dễ dàng hơn so với liên kết bởi loại mime) bạn đã chọn.

THƯỞNG: bạn có thể có một hoạt động chính riêng biệt và khi BroadcastReceiver của bạn được gọi, nó sẽ thực hiện trong cùng một sandbox như ứng dụng của bạn, mà không ảnh hưởng nó (bạn sẽ phải thực hiện điều đó trong phương pháp hoạt động chính của bạn onResume) .

bạn có thể đọc dữ liệu văn bản vào biến tĩnh (s) [luộm thuộm] HOẶC bạn có thể đặt nó trong một SQLite db, đó là vĩnh viễn và an toàn, bất kể ứng dụng và/hoặc điện thoại tắt, ví dụ.

bạn có thể kích hoạt hoạt động và thậm chí không bao giờ bật lên bố cục/cửa sổ - điều này có vẻ lạ trong trường hợp người dùng của bạn muốn xác nhận rằng tệp txt đã được ứng dụng sử dụng chính xác và hoàn toàn.

Các vấn đề liên quan