2016-04-25 3 views
-1

私のskdを使いたい開発者またはクライアントは、APP_KEYを申請するために自分のウェブサイトにアクセスする必要があります。APP_KEYを申請するには、アプリのパッケージ名を提供する必要があります。この "com.edward.myapp" 開発者の証明書のSHA-1(keytoolから生成)。 今、APP_KEYを私のサーバーに送信してAPP_KEYを確認できますが、APP_KEYが有効または無効であることがわかっているのは唯一のことです。クライアントのアプリか他のユーザーのアプリかわかりませんそれはどんなパッケージ名でもかまいません。私はこれが起こるようなことをしたくありません。 これを確認してsdkを使用するのが適切なアプリであることを確認するにはどうすればよいですか?私はクライアントがAPP_KEYを申請するクライアントだけが自分のSDKを使用できるようにするために、クライアントのためにアンドロイドSDKを開発したいと考えていますか?

+1

問題を解決するためのあらゆる努力? – manetsus

+0

私はアンドロイドの生のフォルダに自分の証明書を保存しようとしましたが、次にこのようなパッケージ名を取得します:this.mPacName = mContext.getPackageName();証明書のSHA-1を計算しようとしました。最後に、上記で計算したSHA-1とパッケージ名を使用して値を生成し、この値をマニフェストファイルに格納されているAPP_KEYと比較します。彼のアプリと私のSDKを使用します。 –

答えて

0

実行時のSDKは、APKの署名に使用された証明書のSHA1を取得できます。

String getSignatureSha1(Context context) { 
    PackageManager pm = context.getPackageManager(); 
    PackageInfo info = null; 
    try { 
     info = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES); 
    } catch (NameNotFoundException e) { 
     Log.e(TAG, "Could not find info for " + context.getPackageName()); 
     return null; 
    } 

    byte[] signatureBytes = info.signatures[0].toByteArray(); 
    MessageDigest md = MessageDigest.getInstance("SHA"); 
    md.update(signatureBytes); 
    byte[] digestBytes = md.digest(); 

    StringBuilder builder = new StringBuilder(); 
    for (int i = 0; i < digestBytes.length; i++) { 
     // you can omit this if block if you don't care about the colon separators 
     if (i > 0) { 
      builder.append(':'); 
     } 
     builder.append(String.format("%02X", digestBytes[i] & 0xFF)); 
    } 

    return builder.toString(); 
} 

これは、アプリケーションの起動時に一度実行し、複数回必要な場合は結果をキャッシュする必要があります。

+0

ありがとう、助けて! –

関連する問題