即使有意图过滤器,我的应用程序在共享对话框中也不可见

Posted

技术标签:

【中文标题】即使有意图过滤器,我的应用程序在共享对话框中也不可见【英文标题】:My app is not visible in share dialog even with intent filters in place 【发布时间】:2019-05-14 09:08:49 【问题描述】:

我正在与一个开发应用程序的团队合作,该应用程序具有将图像共享到我们的应用程序的功能。

现在,当我在一个单独的项目中编写此功能时,它运行顺利,我能够在其他应用程序的共享对话框中看到我的测试应用程序。但是,当有人在主项目中集成此功能时,他们根本无法在共享对话框中看到该应用程序。我对 android 原生开发还很陌生,但我很确定这与清单中的冲突有关。

该项目是在 Unity 中完成的,我编写了一个简单的 jar 文件来处理共享数据。

这是工作清单:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.Bigthinx.Droid" xmlns:tools="http://schemas.android.com/tools" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:isGame="true" android:banner="@drawable/app_banner">
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/*"/>
      </intent-filter>
      <intent-filter>z
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/*"/>
        </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>
    <meta-data android:name="unity.build-id" android:value="515ca393-203c-4ab0-af59-c41a3231f421" />
    <meta-data android:name="unity.splash-mode" android:value="0" />
    <meta-data android:name="unity.splash-enable" android:value="True" />
    <meta-data android:name="android.max_aspect" android:value="2.1" />
  </application>
  <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28" />
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

这是无法正常工作的主要项目清单,即使使用了 SEND Intent 过滤器:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.bigthinx.lyflikeandroid" android:installLocation="preferExternal">
  <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" />
  <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:isGame="true" android:banner="@drawable/app_banner" android:theme="@style/VrActivityTheme">
    <activity android:label="@string/app_name" android:name="com.unity3d.player.UnityPlayerActivity" android:screenOrientation="landscape" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
        <category android:name="com.google.intent.category.CARDBOARD" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:name="text/*"/>
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.action.DEFAULT"/>
        <data android:name="image/*"/>  
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>
    <activity android:configChanges="orientation|screenSize|uiMode|screenLayout|smallestScreenSize" android:hardwareAccelerated="true" android:name="com.plakc.browser.PlakcBrowserActivity" android:windowSoftInputMode="stateAlwaysHidden" />
    <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:label="@string/app_name" android:name="com.plakc.videoplayer.player.MyActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
    <!-- This tag is required to use Google Play Services, which the IMA SDK requires -->
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
    <activity android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:name="com.unity.purchasing.googleplay.PurchaseActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    <activity android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:enableVrMode="com.google.vr.vrcore/com.google.vr.vrcore.common.VrCoreListenerService" android:name="com.unity.purchasing.googleplay.VRPurchaseActivity" android:theme="@style/VrActivityTheme">
      <intent-filter>
        <action android:name="com.google.vr.vrcore.ACTION_NONE" />
        <category android:name="com.google.intent.category.DAYDREAM" />
      </intent-filter>
    </activity>
    <meta-data android:name="unity.build-id" android:value="cbfc80f5-baae-4ebe-b696-e499b3dfdc86" />
    <meta-data android:name="unity.splash-mode" android:value="0" />
    <meta-data android:name="unity.splash-enable" android:value="False" />
    <meta-data android:name="android.max_aspect" android:value="2.1" />
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
    <activity android:name="com.facebook.unity.FBUnityLoginActivity" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    <activity android:name="com.facebook.unity.FBUnityDialogsActivity" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    <activity android:name="com.facebook.unity.FBUnityAppLinkActivity" android:exported="true" />
    <activity android:name="com.facebook.unity.FBUnityDeepLinkingActivity" android:exported="true" />
    <activity android:name="com.facebook.unity.FBUnityGameRequestActivity" />
    <activity android:name="com.facebook.unity.FBUnityCreateGameGroupActivity" />
    <activity android:name="com.facebook.unity.FBUnityJoinGameGroupActivity" />
    <activity android:name="com.facebook.unity.AppInviteDialogActivity" />
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="fb256950351806463" />
    <provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider256950351806463" android:exported="true" />
    <activity android:name="com.facebook.CustomTabMainActivity" />
    <receiver android:exported="false" android:name="com.facebook.CurrentAccessTokenExpirationBroadcastReceiver">
      <intent-filter>
        <action android:name="com.facebook.sdk.ACTION_CURRENT_ACCESS_TOKEN_CHANGED" />
      </intent-filter>
    </receiver>
    <!--
         The initialization ContentProvider will call FacebookSdk.sdkInitialize automatically
         with the application context. This config is merged in with the host app's manifest,
         but there can only be one provider with the same authority activated at any given
         point; so if the end user has two or more different apps that use Facebook SDK, only the
         first one will be able to use the provider. To work around this problem, we use the
         following placeholder in the authority to identify each host application as if it was
         a completely different provider.
        -->
    <provider android:authorities="$applicationId.FacebookInitProvider" android:exported="false" android:name="com.facebook.internal.FacebookInitProvider" />
  <!--  <provider 
              android:name="com.yasirkula.unity.UnitySSContentProvider"
              android:authorities="MY_UNIQUES_AUTHORITY"
              android:exported="false"
              android:grantUriPermissions="true"
              />
              -->
  </application>
  <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-feature android:name="android.hardware.camera" />
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
  <uses-permission android:name="com.android.vending.BILLING" />
  <!-- Indicates use of Android's VR-mode, available only on Android N+ -->
  <uses-feature android:name="android.software.vr.mode" android:required="false" />
  <!-- Indicates use of VR features that are available only on official "VR-ready" devices -->
  <uses-feature android:name="android.software.vr.high_performance" android:required="false" />
  <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
  <uses-feature android:name="android.hardware.camera.front" android:required="false" />
</manifest>

如果有人可以帮助我并指出主要项目清单中的问题,我会很高兴。

谢谢!

【问题讨论】:

mime 类型可能会限制发送图像,如果可能,您可以尝试共享文本吗 【参考方案1】:
<intent-filter>
    <action android:name="android.intent.action.SEND"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:name="text/*"/>
</intent-filter>

data 中的android:name 应该是android:mimeType 在第一个清单中是正确的,但在第二个清单中不正确。

【讨论】:

嘿伙计,它成功了。谢谢!其他开发人员没有正确复制意图过滤器。

以上是关于即使有意图过滤器,我的应用程序在共享对话框中也不可见的主要内容,如果未能解决你的问题,请参考以下文章

即使我的作业运行没有错误,SSMS 中也没有出现任何数据

为啥即使包含所有脚本引用,我的 jQuery-UI 对话框也不起作用?

即使在钥匙串中也找不到 iOS 应用商店分发证书

即使使用 -g 标志编译,gdb 中也没有调试符号

Fbconnect 在 ios 应用程序中像网络浏览器一样共享对话

即使更改模型视图矩阵,使用顶点缓冲区对象是不是有意义?