【问题标题】:android, provide navigation serviceandroid,提供导航服务
【发布时间】:2012-09-20 11:59:03
【问题描述】:

我在我的 Android 手机上使用了一些类似 Siri 的助手应用。每当我想让助手引导我到某个地方时,它都会自动调出内置的谷歌(或安卓)导航应用程序。现在我创建了自己的应用程序(做的事情略有不同)。 我应该提供什么服务,以便当导航命令被触发时,它会弹出并与谷歌应用程序竞争,并且用户可以选择下次使用它作为默认应用程序?

谢谢。

【问题讨论】:

标签: android navigation android-service


【解决方案1】:

更新以回应 Tung Mai Le 的 cmets。

为了让您的应用列出来处理 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; 

}

I activated navigation from google maps, and from robin, both produced a list with my app in it, and when selected it recognized the intent etc.

如果您之前选中了使用 google navigator(或除您的之外的任何其他程序)作为 Robin 默认的复选框,那么您的应用程序将无法启动。

您必须清除 robin 的数据,使其不再具有关联的默认首选项(一种核选项,但这是我发现取消关联的唯一方法)

当我将它设置为默认使用我的应用程序时,它总是刚刚启动它并给了我正确的方案和数据包。

显示 robin 的屏幕截图,其中包含可以启动意图的应用程序列表(我的是 Navigation Test)

【讨论】:

  • 看起来很有希望,试试吧!非常感谢。
  • 嗨 Idistic,我试过了,但我的应用似乎无法捕捉到导航意图,我应该检查什么?
  • @TungMaiLe 哪个应用程序正在生成意图,哪些应用程序当前显示在列表中来处理它?
  • @TungMaiLe 我也假设您将意图与主要活动放在同一块中?我认为它不会检查权限,但您可以尝试在清单中添加粗略和精细的访问权限以及互联网。当我要求从谷歌地图导航时,这在我拥有的应用程序中运行良好......
  • 哦,我刚刚再次检查(通过记录),我的应用程序获取的方案为空。是的,我确实将意图放在与主要活动相同的块中。您提到的所有权限都包含在清单中。我正在使用 Robin(一个类似 Siri 的 Anroid 应用程序)来生成意图。目前只有 Google 导航应用显示在列表中。
猜你喜欢
  • 2014-01-20
  • 1970-01-01
  • 2015-06-24
  • 2015-06-22
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多