android,提供导航服务

时间:2012-09-19 03:32:26

标签: android navigation android-service

我在Android手机上使用了一些类似Siri的助手应用程序。每当我希望助手将我送到某个地方时,它会自动调出内置的Google(或Android)导航应用。现在我创建了自己的应用程序(做了稍微不同的事情)。 我应该提供什么服务,以便在触发导航命令时,它会弹出并与Google应用竞争,用户可以选择下次将其用作默认应用程序?

感谢。

1 个答案:

答案 0 :(得分:5)

更新以回应Tung Mai Le的评论。

要列出您的应用以处理google.navigation意图,我创建了一个小程序来测试我以前的答案。它运作正常,所以我不确定问题出在哪里。

在使用Android 4.0的HTC手机上运行时,我不确定您使用的是哪个Android版本,或者您的设备是否已植根等。

完整清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.navigation.com"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <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.VIEW" /> 
                <category android:name="android.intent.category.DEFAULT" /> 
                <data android:scheme="google.navigation" /> 
            </intent-filter>
        </activity>
    </application>

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

</manifest>

完整代码(不尝试解析)

package com.navigation.com;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;

public class MainActivity extends Activity {

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mIntent = getIntent(); 
        if (parseNavigationIntent(mIntent)) {

        {
    }

    private Intent mIntent = null; 

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);


        return true;
    }
}



private boolean parseNavigationIntent(Intent intent) {

   if (null == intent)
      return false; 

   String scheme = intent.getScheme();

   if (null==scheme || (!scheme.equals("google.navigation") && !scheme.equals("geo")))
       return false; 

   String data; 

   if (null == (data = intent.getData().getSchemeSpecificPart()))
       return false; 

    // parse data to get longitude, latitude, and possible address dependent on callers
    // formatting

    return true; 

}

我从谷歌地图激活了导航,并且从知更鸟那里生成了包含我的应用程序的列表,并且在选择时它识别了意图等。

如果您之前已选中使用Google导航器(或除您以外的任何其他程序)作为默认值的复选框,那么您的应用将无法启动。

你必须清除知更鸟的数据,以便它不再具有相关的默认偏好(核选项的类型,但这是我发现取消关联的唯一方法)

当我将其设置为默认使用我的应用时,它始终只是启动它并给了我正确的方案和数据包。

屏幕截图显示robin,其中列出了可以启动意图的应用程序(我的是导航测试)

Robin

My App Listed when navigation was pushed