How intercept a google maps intent in Android?

2019-02-10 20:12发布

问题:

I was trying to intercept a google maps intent as the following:

Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("geo:37.423156,-122.084917"));

but I haven't found any example, link or documentation of this. So, I'm thinking that unfortunately is not possible.

In the Manifest file I put several intent filters. Specially I think that the next intent filter must match with the mentioned intent.

<intent-filter>
<action android:name="android.content.Intent.ACTION_VIEW" />
        <data android:scheme="geo"/>
    </intent-filter>

In addition I tried to investigate what activities match with this particular intent by means of:

List resolves = getPackageManager().queryIntentActivities(myIntent, 0 );
ResolveInfo firstRevolve=(ResolveInfo) resolves.get(0);
IntentFilter myIF=firstRevolve.filter;

Nevertheless only MapsActivity matches with the intent, not my Activity, and surprisingly myIF is null, so that I can't obtain the intent filter that the google maps activity uses.

In addition I installed "Intent Intercept" from Android Market, but it does not capture this intent.

So, I need some help/idea. Somebody knows what is happening? In my opinion Google restricts this interceptions but this restriction is not specified.

Any help will be appreciated. Best regards, Pablo.

回答1:

The code example below is just working fine in my project.

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="https" android:host="maps.google.com" />
    <data android:scheme="geo" />
</intent-filter>


回答2:

So, I'm thinking that unfortunately is not possible.

I am rather sure that it is.

Specially I think that the next intent filter must match with the mentioned intent.

You have the wrong action string. If you read the documentation, the string representation of ACTION_VIEW is:

android.intent.action.VIEW

which is not what you have in your <intent-filter>.



回答3:

This manifest entry worked for me:

    <activity
        <intent-filter>  
          <!-- Filter to run activity without geo --> 
            <action android:name="com.example.MYACTION" />                
            <category android:name="android.intent.category.DEFAULT" />                     
        </intent-filter>
        <intent-filter>   
            <!-- Filter for geo scheme geo -->                  
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />               
            <data android:scheme="geo" />
        </intent-filter>
    </activity>

in your activity you can check onCreate:

protected void onCreate(Bundle savedInstanceState) {
  Intent intent = getIntent();  
  String action = intent.getAction();
  Uri data      = intent.getData();

  if(      Intent.ACTION_VIEW.equals(action) ) {
    if(data != null && "geo".equals(data.getScheme())) {  

      // do something with geo uri data
    }
  }
  else {
    // Code for activity when it`s started without geo uri
  }
}


回答4:

I have been trying to get this to work as well. there seems to be couple of way here:

1) Intents with scheme: "http" or "https" with authority "maps.google.com". This seems to function normally as standard intents do. 2) using the "geo" scheme as OP mentioned in the question. Seems like this is not open to be intercepted.

@CommonsWare Even if one uses "android.intent.action.VIEW" in the manifest with the following filter: ,

it seems NOT possible to intercept it.

When you mentioned "I am rather sure that it is.", did you mean it IS possible or it IS NOT possible?



回答5:

I use multi intent filter and this work with me

            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="google.navigation"/>
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data
                    android:host="maps.google.com"
                    android:scheme="https"/>
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data
                    android:host="maps.google.com"
                    android:scheme="http"/>
            </intent-filter>


回答6:

For this you should add the following <intent-filter> inside the <activity></activity> tag of the respective ACTIVITY in AndroidManifest.xml file.

<intent-filter >
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="geo"/>
    <data android:scheme="google.navigation"/>
</intent-filter>