Работает нормально: приложение, над которым я работаю, вызывается для открытия текстовых файлов (байтовые массивы) в виде файлов рабочих данных (чистые старые текстовые файлы (.se и .si, не зарегистрированные типы файлов MIME)Входные файлы моих приложений никогда не бывают .txt или .csv) и xml-файлы).И если содержимое в порядке, открывается сеанс с отображением содержимого файла в виде списка отчетов.Получение намеренных звонков из приложений Filer или добавлены в электронную почту.(Это основная бизнес-структура приложения).
Вот как получены намерения и как я отклоняю неправильный контент (отлично работает, когда вызывается любым другим приложением, кроме моего):
if (action.compareTo(Intent.ACTION_VIEW) == 0) {
// Open data from other app with intent
String scheme = intent.getScheme();
ContentResolver resolver = getContentResolver();
Uri uri = intent.getData();
String sFileName = null;
if (scheme.compareTo(ContentResolver.SCHEME_CONTENT) == 0)
sFileName = Utils.getContentName(resolver, uri);
else if (scheme.compareTo(ContentResolver.SCHEME_FILE) == 0)
sFileName = uri.toString();
int iRet = (-1);
byte[] readData = Utils.ReadInputData(resolver, uri);
if (readData == null) {
// Open data by file name
iRet = ...
} else {
// Open data by byte array (file data from the other app)
iRet = ...
}
}
if (iRet == 0) {
// OK
this.setResult(Activity.RESULT_OK, null);
} else {
// Failure
this.setResult(Activity.RESULT_CANCELED, null);
this.finish();
return;
}
}
Все работает очень хорошо, открывает входящие правильныефайлы.Это также хорошо работает, если Android-файлер, другие приложения-файлеры или электронные письма пытаются вызвать текстовый файл, который не имеет правильного содержимого, ответ - отклонение, ОК.
Работает нормально: приложение также вызывает другие приложения для отображения текстовых файлов , csv-текстовые (.csv) файлы (MS Excel и т. Д.) И текстовые файлы с вкладками (.txt) (MSWord и т. Д.) Отчетов, отображаемых на экране (для дополнительного анализа и представления в этих приложениях).
Intent intent = new Intent(Intent.ACTION_VIEW);
File file = new File(FilePathName);
String extension = file.getName().substring(file.getName().lastIndexOf(".") + 1);
Uri uri = Uri.parse(FilePathName);
// From Build.VERSION_CODES.N there is entire different file view intent business
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
uri = FileProvider.getUriForFile(activity.getApplication(),
activity.getApplication().getPackageName(), file);
// We have to ask around for permissions to display the file
List<ResolveInfo> resInfoList = activity.getPackageManager().queryIntentActivities(
intent, PackageManager.MATCH_DEFAULT_ONLY);
if(resInfoList==null)
return;
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
// An attempt to exlude oneself (don't work)
if (!packageName.equals("com.my.app"))
activity.grantUriPermission(
packageName,
uri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
} else // Elder up to Android 6
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(uri, MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension));
try {
activity.startActivity(intent);
} catch (ActivityNotFoundException e) {
...
}
Это прекрасно работает, когда другие приложения получают интент-вызов.
Моя проблема: существует очевидный риск, что мое приложение называет себя (пользователь выбирает мое приложение по вызову из моего приложения, или мое приложение является единственным открытым приложением, которое отвечает на запросы).И это не было бы проблемой, если бы не мое приложение зависало, отвергая собственные файлы (неправильный контент), но не намеренные вызовы других приложений.
На самом деле у меня есть два пути решения, и я не могу заставить ни один из них работать?
- Отфильтровывать, вызывая себя с помощью resolInfo, если (!packageName.equals ("com.my.app"))
- Устранение сбоя после отклонения моих собственных файлов при интент-вызовах
Отфильтровывать вызовы себя с помощью resolInfo У меня нет собственного приложения в списке resInfoList, поэтому я не могу его пропустить ???Это должно работать, в соответствии с другими Stackoverflow Q / A, но не для меня?Но после этого приложение вызывается по моему собственному намерению (у эмулятора HAXM нет другого приложения для интерпретации csv, поэтому оно отправляет вызов намерения без выбора приложения).
Устранение сбоя после отклонения моих собственных файлов , я понятия не имею, что его вызывает.
Да, я могу иметь и обрабатывать несколько видов деятельностифайлы, один из которых само приложение открывает файл, отличается от действий файловых и почтовых приложений.И он отлично работает с 2,3 и 4 действиями и получает отклоненный вызов, все они выживают.Я считаю возможность мультиактивности основной функцией приложения.И эта проблема все еще будет существовать только с возможностью одной активности.
Да, я могу уничтожить свою собственную активность с помощью this.finish () , когда я вызываю себя.И тогда мне нужно (что-то вроде) отправить идентификатор активности с намерением, и если он такой же, просто отбросить его.Но удивительная вещь в том, что происходит сбой и без вызова this.finish () при отклонении?На самом деле, если я ничего не делаю, получая преднамеренные звонки от себя, он также падает после ухода, но не из-за преднамеренных звонков от других.Меня смущает, так что эта идея тоже не работает.
Любые хорошие подсказки на пути решения или объяснение, почему я терплю неудачу?
Вот мой сбой:
2019-02-21 05:39:27.482 6149-6149/com.me.myapp.Myapp D/AndroidRuntime: Shutting down VM
2019-02-21 05:39:27.484 6149-6149/com.me.myapp.Myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.me.myapp.Myapp, PID: 6149
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 5, found: 0 Pager id: com.me.myapp.Myapp:id/pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.me.myapp.MainActivity$ViewPagerAdapter
at android.support.v4.view.ViewPager.populate(ViewPager.java:1135)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1084)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614)
at android.view.View.measure(View.java:22002)
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1060)
at android.view.View.measure(View.java:22002)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:22002)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:451)
at android.view.View.measure(View.java:22002)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:721)
at android.view.View.measure(View.java:22002)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2410)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1498)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1751)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
И когда я делаю намерениевызовы из файла Android (никакое другое приложение не отвечает на CSV-файл, и я отклоняю его, как указано выше), я получаю следующее сообщение в дампе (но мое приложение не вылетает, но я полагаю, что это моя активность вызывающего приложения, котораявылетает):
2019-02-21 05:57:15.811 7746-7746/com.me.myapp.Myapp E/ActivityThread: Activity com.me.myapp.MainActivity has leaked IntentReceiver com.me.myapp.MainActivity$5@e1fa714 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.me.myapp.MainActivity has leaked IntentReceiver com.me.myapp.MainActivity$5@e1fa714 that was originally registered here. Are you missing a call to unregisterReceiver()?