Как запретить моей активности открывать другой экземпляр в другом приложении из общего меню? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть приложение, которое позволяет другим приложениям, которые могут обмениваться файлами, выбирать его в меню общего доступа, открывать приложение и «передавать» файлы в мое приложение.

Моя проблема заключается в том, что они выбираютмое приложение из меню общего доступа (например, в галерее, после выбора нескольких фотографий, они решили поделиться с моим приложением), активность входа открывается в приложении галереи

Обратите внимание, что я пробовал этот процесс работаетна старых устройствах, и это работало, но не для более нового устройства.

Это мой 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 вызывается, как и ожидалось, но на более новом устройстве он просто игнорируетe launcherMode и создает новый экземпляр и запускает onCreate ()

Любые идеи о том, как заставить приложение «принудительно» запускаться при вызове из общего меню?

Текущие устройства тестирования - Samsungмобильный Android 8.0, API 26 - не работает Samsung Tablet Android 7.1.1, API 25 - работает как положено

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Я покопался в других приложениях на устройстве и обнаружил, что эта проблема возникает только при обмене изображениями из приложения «Галерея», в противном случае код работает должным образом, поэтому я считаю, что это может быть проблемой самой галереи или ожидаетсяповедение для приложения Галерея.

0 голосов
/ 25 октября 2018

Вся ваша проблема связана с разрешениями, для старых устройств ниже 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

...