Android:自动选择调试/发布Maps api密钥?

tom*_*ash 40 debugging android google-maps key android-mapview

OBSOLETED:这个旧问题是指过时的Google Maps v1 API.使用v2 API时,您可以在一个Google API控制台条目中使用多个证书指纹.API密钥不再存储在Manifest或代码中.


是否可以自动检测哪个证书用于签名APK?我想在应用程序中同时调试和发布Maps证书,并将有效的证书传递给MapView构造函数.

通过这样的设置,我在发布应用程序时不会出错 - 我在模拟器和我的设备上使用调试证书,然后在将应用程序发送到Market之前使用第一版进行签名.

我正在考虑检测我的特定设备或调试器是否已连接,但它并不完美.也许某些文件标记需要调试证书?有没有更好的方法?

Ale*_*nov 47

有一种新方法可以确定它是SDK Tools,Revision 17中的调试版本还是发布版本.新功能概述的摘录:

Builds现在生成一个名为BuildConfig的类,其中包含一个DEBUG常量,该常量根据您的构建类型自动设置.您可以检查代码中的(BuildConfig.DEBUG)常量以运行仅调试函数.

所以现在你可以简单地写下这样的东西:

if (BuildConfig.DEBUG)
{
    //Your debug code goes here
}
else
{
    //Your release code goes here
}
Run Code Online (Sandbox Code Playgroud)

更新:我在ADT中遇到过错误:有时BuildConfig.DEBUGtrue在导出应用程序包之后.说明如下:http://code.google.com/p/android/issues/detail?id = 27940


Bac*_*chi 26

与API密钥有同样的麻烦.这是一个完整的解决方案,基于上面的链接和Bijarni的例子(不知何故对我不起作用),我现在使用这个方法:

// Define the debug signature hash (Android default debug cert). Code from sigs[i].hashCode()
protected final static int DEBUG_SIGNATURE_HASH = <your hash value>;

// Checks if this apk was built using the debug certificate
// Used e.g. for Google Maps API key determination (from: http://whereblogger.klaki.net/2009/10/choosing-android-maps-api-key-at-run.html)
public static Boolean isDebugBuild(Context context) {
    if (_isDebugBuild == null) {
        try {
            _isDebugBuild = false;
            Signature [] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
            for (int i = 0; i < sigs.length; i++) {
                if (sigs[i].hashCode() == DEBUG_SIGNATURE_HASH) {
                    Log.d(TAG, "This is a debug build!");
                    _isDebugBuild = true;
                    break;
                }
            }
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }      
    }
    return _isDebugBuild;
}
Run Code Online (Sandbox Code Playgroud)

你必须找出你的调试签名的hashValue()一次,只输出sigs [i] .hashCode().

然后,我不想动态添加MapView,而是使用xml文件.你不能在代码中设置api key属性并使用xml布局,所以我使用这个简单的方法(虽然复制xml布局不是那么漂亮):

在我的MapActivity中:

    public void onCreate(Bundle savedInstanceState)
    {       
    super.onCreate(savedInstanceState);

    // Select the proper xml layout file which includes the matching Google API Key
    if (isDebugBuild(this)) {
        setContentView(R.layout.map_activity_debug);
    } else {
        setContentView(R.layout.map_activity_release);
    }
Run Code Online (Sandbox Code Playgroud)

  • 一句话 - 我不喜欢你的两个布局,因为它需要在两个文件中同时进行任何更改,而不是我通过`new MapView(this,isDebug?keyDebug:keyRelease)创建MapView;`并将其添加到当前布局. (4认同)
  • 您总是可以拥有3个布局文件,而您打开的2个只有两个<include>来实现MapView上方和下方的实际实现. (4认同)

Sur*_*iya 10

确定它是否是调试版本的更简单方法是检查应用程序信息上的调试标志而不是签名哈希.

public boolean isDebugBuild() throws Exception
{
   PackageManager pm = _context.getPackageManager();
   PackageInfo pi = pm.getPackageInfo(_context.getPackageName(), 0);

   return ((pi.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0);
}
Run Code Online (Sandbox Code Playgroud)

找到调试版本后,您可以使用不同的资源来显示地图,也可以在应用程序中创建mapview并添加到布局中.

    if(isDebugBuild())
    {
        _mapView = new MapView(this, getString(R.string.debugmapskey));
    }
    else
    {
        _mapView = new MapView(this, getString(R.string.releasemapskey));
    }
Run Code Online (Sandbox Code Playgroud)

  • 嗨Bachi,从SDK工具版本8,http://developer.android.com/sdk/tools-notes.html(一般说明)你不需要在AndroidManifest中添加debuggable标志,工具会根据发布自动设置它们或者发展. (3认同)

pen*_*Dev 5

这里的所有答案似乎都已经过时了,如果您使用的是 android studio 那么 gradle 就是正确的选择

在 build.gradle 中使用不同的键

android {
  .. .. ...
    buildTypes {
       debug {
          resValue "string", "google_maps_api_key", "[YOUR DEV KEY]"
       }
       release {
           resValue "string", "google_maps_api_key", "[YOUR PROD KEY]"
       }
    }
  }
Run Code Online (Sandbox Code Playgroud)

在你的AndroidManifest.xml

<meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_api_key"/>
Run Code Online (Sandbox Code Playgroud)

来源

如果您想保存一些密码以进行不同的调试和发布,那么您应该遵循此操作