Intereting Posts
Java.util.zip.ZipException: дубликат записи с использованием firebase Вызов мягкой клавиатуры Android из файла C ++ Проверка Android TTS для поддерживаемой локали с отсутствующими / не загруженными речевыми данными Android get Support Action Bar всегда возвращает NULL Как установить разделитель (до нуля) настраиваемого макета ListFragment Сделать вызов API REST из IntentService или AsyncTask? Почему получение Google Directions для Android с использованием данных KML больше не работает? Bluetooth-соединение без подтверждения пользователя Как отображать как нормальные, так и раздвоенные ActionBar? Android Overriding onBackPressed () Как показать один макет поверх другого программным способом в моем случае? Как сделать NumberPicker единовременным Android usb мыши правой кнопкой мыши правильное поведение (ICS) Android, работающий с устройствами IoT без подключения к Интернету Android фокусируется и фокусируется в сенсорном режиме

Почему мое приложение в списке приложений не открывает файл txt?

У меня есть приложение для чтения текста, которое предназначено для получения намерений от системы Android, когда я нажимаю на текстовый файл, чтобы открыть его. Но мое приложение не входит в список, который выдает система. Ниже приведены мои коды:

манифест

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

Благодаря!

Вам необходимо связать приложение с расширением файла. Чтобы сделать это, добавьте эти две строки в фильтр намерений, и вам хорошо идти

 <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="*/*" /> => соответствует любому типу mime

<data android:pathPattern=".*\\.txt" /> => Здесь вы указываете, какое расширение вы хотите сопоставить

Надеюсь, что эта помощь

Разрабатывая псевдокод HERO, это эффективно работает:

Измените <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 (он НЕ должен быть вашей основной деятельностью , см. BONUS ниже):

 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 с другим приложением …)

Ваше приложение НЕ должно быть активным, чтобы поймать намерения. После установки система распознает его как одно из «приложений goto» для определенных типов и / или расширений mime (менее просто, чем ассоциировать с типом mime), который вы выбрали.

БОНУС: вы можете иметь отдельный MAIN-актив, и когда вызывается BroadcastReceiver, он будет выполняться в той же песочнице, что и ваше приложение, без воздействия на нее (вам придется реализовать это в методе onResume вашей onResume активности).

Вы можете читать текстовые данные в статические переменные (sloppy) ИЛИ вы можете поместить их в SQLite db, который является постоянным и безопасным , независимо от приложения и / или закрытия телефона, например.

Вы могли бы активировать работу и даже не запускать макет / окно – что-то вроде странного, если ваш пользователь хочет получить какое-то подтверждение, что txt-файл был правильно и полностью использован приложением.

Вы должны зарегистрировать ACTIVITY, а не широковещательный приемник с атрибутами фильтра.