Как получить URI из входящего намерения приложения Android

Я прочитал это стандартное описание от Google: https://developer.android.com/training/sharing/receive

Вслед за этим я обновил свой AndroidManifest.xml, включив в него фильтр намерений для приема общего доступа из других приложений (для различных типов MIME).

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".SplashActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="SnapLinx Share"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.VIEW" />
            <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="image/*" />
            <data android:mimeType="text/*" />
            <data android:mimeType="video/*" />
            <data android:mimeType="audeo/*" />
            <data android:mimeType="application/*" />
        </intent-filter>
    </activity>
    <activity
        android:name=".SignInActivity"
        android:label="@string/title_activity_sign_in"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>
    <activity
        android:name=".SignUpActivity"
        android:label="SignUpActivity"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>
    <activity
        android:name=".ForgotPasswordActivity"
        android:label="ForgotPasswordActivity"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>
    <activity
        android:name=".MainActivity"
        android:label="SnapLinx Share"
        android:theme="@style/AppTheme">
    </activity>

    <service
        android:name=".BLEScanIntentSvc"
        android:enabled="true"
        android:exported="false">
    </service>
    <service
        android:name=".NotificationIntentSvc"
        android:exported="false">
    </service>
</application>

I am able to see my app as a share option within other apps and when I select a file within other apps (e.g. an image file within the Photos app) and select the option to share with my app, my app is launched just fine. To start with, I am trying to simply log share parameters within my MainActivity onCreate(). See this code:

    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    / First try at getting Uri obj.
    Uri FileURI = intent.getData();

    if (Intent.ACTION_SEND.equals(action) && type != null)
    {
        Log.i(LOGTAG, "File intent. Type: " + type);
        Log.i(LOGTAG, "File intent. Action: " + action);


        FileURI = (Uri) intent.getParcelableExtra(Intent.EXTRA_TEXT);
        if (FileURI != null)
        {
            Log.i(LOGTAG, "File intent. URL: " + FileURI.toString());
        }
    }

Полученные строки действий и типов («android.intent.action.SEND» и «image / *») верны, но у меня нет способа получить Uri файла, которым я поделился, из приложения «Фото». intent.getData () и intent.getParcelableExtra (Intent.EXTRA_TEXT) и intent.getParcelableExtra (Intent.EXTRA_STREAM) всегда возвращают значение null.

Если я прервусь в отладчике, все атрибуты намерения (которые, как ожидается, будут поддерживать доступ Uri) будут иметь значение null (т.е. mCatagories = null, mClipData = null mData = null, mExtras = null).

Флаги обозначены mFlags = 524288 .... не уверен, что это поможет.

Я строю с помощью компилируемого SDK и целевого SDK как на 28, так и на минимальном SDK на 23.

Мое тестовое устройство - Galaxy S7 с версией 8.0.0.

Любой совет приветствуется.

Марк Дж


person Mark J    schedule 31.01.2019    source источник
comment
Вы можете проверить ClipData в Intent? Это может быть   -  person Phúc Nguyễn    schedule 20.03.2021


Ответы (1)


Попробуйте использовать Intent.EXTRA_STREAM вместо Intent.EXTRA_TEXT. Как этот (Uri) intent.getParcelableExtra (Intent.EXTRA_STREAM);

person elham    schedule 31.01.2019
comment
Привет, эльхам. Нет разницы. Когда используется intent.getParcelableExtra (Intent.EXTRA_STREAM) или intent.getParcelableExtra (Intent.EXTRA_TEXT), результат тот же. возвращается null. - person Mark J; 01.02.2019