How intercept a google maps intent in Android?
I was trying to intercept a google maps intent as the following:
Intent myIntent = new Intent(android.conte开发者_如何转开发nt.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.
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>
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>
.
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
}
}
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?
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>
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>
精彩评论