41

廃止:この古い質問は、廃止されたGoogle Mapsv1APIに関するものです。v2 APIを使用する場合、1つのGoogleAPIコンソールエントリで複数の証明書フィンガープリントを使用できます。APIキーはマニフェストにもコードにも保存されなくなりました。


APKの署名に使用された証明書を自動的に検出することはできますか?アプリケーションにMaps証明書のデバッグとリリースの両方を設定し、有効な証明書をMapViewコンストラクターに渡したいのですが。

このような設定では、アプリケーションのリリース中に間違いを犯すことはありません。エミュレーターとデバイスでデバッグ証明書を使用し、リリース1で署名してから、アプリをMarketに送信します。

特定のデバイスを検出することや、デバッガーが接続されているかどうかを考えていましたが、完全ではありません。たぶん、デバッグ証明書のファイルマーキングが必要ですか?より良い方法はありますか?

4

11 に答える 11

48

SDK Tools、リビジョン17のデバッグビルドまたはリリースであるかどうかを判断する新しい方法があります。新機能の概要からの抜粋:

ビルドは、ビルドタイプに応じて自動的に設定されるDEBUG定数を含むBuildConfigと呼ばれるクラスを生成するようになりました。コード内の( BuildConfig.DEBUG )定数をチェックして、デバッグ専用関数を実行できます。

これで、次のように簡単に書くことができます。

if (BuildConfig.DEBUG)
{
    //Your debug code goes here
}
else
{
    //Your release code goes here
}

更新: ADTでバグが発生しました:アプリケーションパッケージをエクスポートした後の場合BuildConfig.DEBUGがあります。true説明はこちら:http ://code.google.com/p/android/issues/detail?id = 27940

于 2012-03-24T08:26:02.280 に答える
27

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;
}

デバッグシグネチャのhashValue()を一度見つけて、sigs [i] .hashCode()を出力する必要があります。

次に、MapViewを動的に追加するのではなく、xmlファイルを使用しました。コードでapiキー属性を設定して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);
    }
于 2010-09-30T08:11:03.473 に答える
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);
}

デバッグビルドが見つかったら、マップを表示するために別のリソースを使用するか、アプリ内でマップビューを作成してレイアウトに追加することができます。

    if(isDebugBuild())
    {
        _mapView = new MapView(this, getString(R.string.debugmapskey));
    }
    else
    {
        _mapView = new MapView(this, getString(R.string.releasemapskey));
    }
于 2011-05-16T21:56:00.147 に答える
5

ここでのすべての回答は時代遅れのようです。AndroidStudioを使用している場合は、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]"
       }
    }
  }

そしてあなたのAndroidManifest.xmlで

<meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_api_key"/>

ソース

また、デバッグとリリースのためにいくつかのパスワードを別の方法で保存したい場合は、これに従う必要があります

于 2016-03-30T13:15:10.417 に答える
3

に格納されているプロパティにすることで、ビルドプロセスとソース管理へのAPIキーの恐ろしい誤統合を回避しましたlocal.properties。私は以下を追加する必要がありましたbuild.xml

<property name="mapviewxml" value="res/layout/mapview.xml" />
<target name="-pre-build">
    <fail unless="mapsApiKey">You need to add mapsApiKey=... to local.properties</fail>
    <copy file="mapview.xml.tpl" tofile="${mapviewxml}" overwrite="true">
        <filterchain>
            <replacetokens>
                <token key="apiKey" value="${mapsApiKey}"/>
            </replacetokens>
        </filterchain>

    </copy>
</target>

mapview.xml.tplもちろん、プロジェクトのルートで作成する必要がありましres/layoutた(ビルドプロセスが中断されるため、ルートに移動できません)。

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mapview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="@apiKey@"
    />

事前コンパイル中に、テンプレートが適切な場所にコピーされ、@apiKey@が実際のキーに置き換えられます。残念ながら、このフェーズではデバッグビルドとリリースビルドを区別する方法が見つからなかったため、リリース用にコンパイルするには、リリースapiKeyをantパラメーターに追加するだけです。

ant -DmapsApiKey=.... release 

このアプローチは、SCM(キーをチェックインする必要はありません)とうまく統合され、ビルドプロセスとうまく統合されます。

于 2010-12-12T09:57:17.393 に答える
3

あなたがまだ興味を持っているなら、私はこれを行う別の方法についてブログを書きました。Androidビルドスクリプトに簡単な変更を加えるだけで、MapAPIキーとその他すべての必要なリリース変更を切り替えることができます。これについて私が気に入っているのは、デバッグ関連のものがリリースに含まれておらず、XMLレイアウトを以前と同じように維持できることです。

http://blog.cuttleworks.com/2011/02/android-dev-prod-builds/

于 2011-02-01T03:00:29.440 に答える
3

リリースキーとデバッグキー(両方とも同じパッケージへのマッピング)の両方を含むエントリをGoogle APIのコンソールに作成することはうまく機能し、デバッグしているのかコンパイルしているのかを心配する必要がないはるかに簡単な方法だと思います。リリースバージョン。解決策はここに概説されています

于 2013-08-31T05:47:36.357 に答える
1

SDカードに特別なファイルがあります。存在する場合は、デバッグキーを使用してください。行方不明-リリース1を使用します。そしてそれは動作します。

編集:新しい受け入れられた答えを見てください、それはより良く機能します

于 2010-06-13T23:15:11.617 に答える
1

これが誰かに役立つかどうかはわかりませんが、他のいくつかの提案をここにマージして、次のMapViewActivityを作成しました。

この例では、R.layout.map_dbgは、これがデバッグビルドであり、ファイルが存在する場合にのみ使用されます(このファイルを.gitignoreに追加します)。

このアプローチの利点は次のとおりです。

  1. アリのターゲットを書く必要はありません(Eclipseを使用する場合に適しています)
  2. 正しいリリースキーは常にmap.xmlにあります(デバッグキーが誤ってチェックインされないことを願っています)
  3. リリースキーは常にリリースビルドに使用されます
  4. 複数のデバッグキーを使用できます

このアプローチの欠点は次のとおりです。

  1. map.xmlが更新されるたびに、map_dbg.xmlを更新することを忘れないでください。

    public class MapViewActivity extends MapActivity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //
            // copy the map.xml to map_dbg.xml and update the api key. 
            //
            int id = getLayoutId("map_dbg");
            if(id ==0)
                id = R.layout.map;
    
            setContentView(id);
        }
    
        int getLayoutId(String name) {
            return isDebugBuild() ? getResources().getIdentifier(name, "layout", getPackageName()) : 0;
        }
    
        public boolean isDebugBuild() 
        {
            boolean dbg = false;
            try {
                PackageManager pm = getPackageManager();
                PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
    
                dbg = ((pi.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0);
            } catch (Exception e) {
            }
            return dbg;
        }
    
    }
    
于 2011-08-12T16:22:06.023 に答える
0

apikeyをデバッグキーまたはリリースキーのいずれかに置き換える単純なantターゲットを設定しました。これは本当にシンプルで、コードに不要なロジックがないようにします。

<target name="apikey">
    <!-- Location of target layout file -->
    <first id="first">
        <fileset dir="." includes="res/layout/kondi_training_templates.xml" />
    </first>
    <property name="layout-file" value="${toString:first}"/>
    <echo>template-file: ${template-file}</echo>

    <replaceregexp file="${template-file}"
        match="android:apiKey=.*"
        replace='android:apiKey="${mapview.apikey}"'
        byline="true"
    />
</target>
于 2013-01-22T12:28:35.213 に答える
0

Map V2では、AndroidStudioGradleツールを使用して個別のキーを簡単に送信できます。そのための簡単な方法を実装しました。こちらのリンクを確認してください。

于 2016-09-01T13:19:57.393 に答える