Как запретить моей активности открывать другой экземпляр в другом приложении из общего меню?
У меня есть приложение, которое позволяет другим приложениям, которые могут обмениваться файлами, выбирать его в меню общего доступа, открывать приложение и "передавать" файлы в мое приложение.
Моя проблема в том, что когда они выбирают мое приложение из меню "Поделиться" (например, в галерее, после выбора нескольких фотографий они выбирают поделиться с моим приложением), действие входа открывается в приложении галереи.
Обратите внимание, что я пробовал этот процесс работает на старых устройствах, и он работал, но не для более нового устройства.
Это мой manifest.xml
<application
android:name="com.Application"
android:allowBackup="true"
android:fullBackupContent="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:mimeType="*/*"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:windowSoftInputMode="adjustPan"/>
<activity
android:name=".login.LoginActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:windowSoftInputMode="adjustResize|stateVisible">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
</application>
У меня есть два действия для этого приложения, логин и Main, Main будет загружен в случае успешного входа.
Я пробовал с различными настройками launcherMode, но ничто не мешало созданию экземпляра в галерее
Это из моего логина
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
receivedIntent = getIntent();
//set orientation
setRequestedOrientation(isPhone() ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null && intent.getAction() != null && (intent.getAction().equals(Intent.ACTION_SEND) || intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE))){
finish();
startActivity(intent);
}
}
Проблема в том, что на более старом устройстве метод onNewIntent вызывается, как и ожидалось, но на более новом устройстве он просто игнорирует launcherMode, создает новый экземпляр и запускает onCreate().
Любые идеи о том, как заставить приложение "принудительно" запускать себя при вызове из общего меню?
Текущие устройства тестирования - Samsung mobile Android 8.0, API 26 - не работает Samsung Tablet Android 7.1.1, API 25 - работает должным образом
2 ответа
Я покопался в других приложениях на устройстве и обнаружил, что эта проблема возникает только при обмене изображениями из приложения "Галерея", в противном случае код работает должным образом, поэтому я считаю, что это может быть проблемой самой галереи или ожидаемым поведением для Галерея приложений.
Вся ваша проблема связана с разрешениями. Для старых устройств ниже kitkat(4.4.2) не требуются права доступа к файлу, но на новых устройствах требуются разрешения для доступа к данным файла (т. Е. Галерея и другие). Вы должны дать разрешение программно,
if (Build.VERSION.SDK_INT > 19) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
arrPerm.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!arrPerm.isEmpty()) {
String[] permissions = new String[arrPerm.size()];
permissions = arrPerm.toArray(permissions);
ActivityCompat.requestPermissions(this, permissions, MY_PERMISSIONS_REQUEST);
}
}
После получения разрешения вы можете выполнить свою операцию:
if (Build.VERSION.SDK_INT > 19) {
if (isPermissionGranted()) {
//Do your Task of gallery
}
}
Или альтернативным способом, вы можете использовать библиотеку напрямую: https://github.com/nabinbhandari/Android-Permissions