我正在使用 SMS Retriever API 发送和接收 otp 消息。当我在发布和调试模式下测试我的应用程序时,它工作正常并自动读取 otp 但是当我将我的应用程序上传到 Play 商店时它停止工作。我必须手动输入我的 otp。请检查我的代码我做错了什么。
我使用 AppSignatureHashHelper 类生成了 11 个字符的字符串哈希码,并将 11 个字符的代码传递给服务器。然后我使用广播接收器读取短信并从短信解析 otp 并发送回服务器。
///////////////发送电话号码和hashKey到服务器////////////
phoneNo = phoneText.getText().toString();
System.out.println( phoneNo );
params.put( "mob_no", phoneNo );
//String debugHashKey = "Yq%2BZIxNoG%2BK";
//String releaseHashKey = "h9mVMD4POjg";
String appSigningKey = "b4epgGrrtyp";
params.put( "uniqueKey", releaseHashKey );
asyncHttpClient.post( mob_validate, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
System.out.println( "onSuccess" );
status = response.getString( "status" );
msg = response.getString( "msg" );
Toast.makeText( getApplicationContext(), msg, Toast.LENGTH_SHORT ).show();
if (status.equals( "success" )) {
Intent intent = new Intent( MainActivity.this, OTPConfirmationActivity.class );
intent.putExtra( "phone_no", phoneNo );
startActivity( intent );
finish();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
//Toast.makeText( getApplicationContext(), R.string.onFailure, Toast.LENGTH_SHORT ).show();
}
///////////////使用广播接收器读取短信并发送回服务器//////////////////
params.put( "otp", otp );
params.put( "mob_no", phoneNo );
asyncHttpClient.post( verify_otp, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
status = response.getString( "status" );
msg = response.getString( "msg" );
Toast.makeText( OTPConfirmationActivity.this, msg, Toast.LENGTH_SHORT ).show();
if (status.equals( "success" )) {
endTimer();
sharedPreferences.edit().putBoolean( "logged", true ).apply();
Intent intent = new Intent( getBaseContext(), HomeActivity.class );
startActivity( intent );
finish();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
//Toast.makeText( getApplicationContext(), R.string.onFailure, Toast.LENGTH_SHORT ).show();
}
///////////Build.gradle 文件////////////////////
android {
signingConfigs {
release {
storeFile file('/home/eazysoft/Documents/finalKey/releaseKey.jks')
storePassword 'password'
keyAlias = 'upload'
keyPassword 'password'
}
}
compileSdkVersion 28
defaultConfig {
applicationId "com.eazysoft.lookAround"
minSdkVersion 15
targetSdkVersion 28
versionCode 3
versionName "1.0.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
signingConfig signingConfigs.release
}
buildTypes {
release {
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
debuggable = true
}
debug {
debuggable true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.0-alpha4'
testImplementation 'junit:junit:4.13-beta-2'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:exifinterface:28.0.0'
implementation 'com.google.android.gms:play-services-maps:16.1.0'
implementation 'com.google.android.gms:play-services-location:16.0.0'
implementation 'com.google.android.gms:play-services-base:16.1.0'
implementation 'com.google.android.gms:play-services-identity:16.0.0'
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'com.google.android.gms:play-services-auth-api-phone:16.0.0'
implementation 'com.loopj.android:android-async-http:1.4.9'
}
请查看我的代码并帮助我在 google play store 上进行配置。
解决方案: 我找到了我的问题的解决方案,这是配置问题。
第 1 步:将您的应用程序上传到 google play 商店后,google 生成了两个证书(应用程序签名),首先是上传证书(上传密钥),这是您生成的应用程序签名密钥。此密钥用于更新或上传您的应用到 Google Play 商店。
其次是应用签名证书,当用户从 Play 商店安装您的应用时使用。该证书帮助我们生成另一个 11 位字符串代码。为此,请先下载 App 签名证书。
第 2 步:使用您的 android studio 终端并粘贴这条命令
keytool -importcert -alias myalias -file /home/Downloads/deployment_cert.der -keystore certificate.jks -storepass mypassword
保留别名和存储密码,因为它只是更改文件路径
第 3 步:运行此命令后,一条消息将显示“信任此证书?[否]:”然后键入“y”,然后另一条消息将显示“证书已添加到密钥库”。此 certificate.jks 文件存储在您的项目中,或者只是搜索此文件。
第 4 步:生成 certificate.jks 文件后,使用以下命令生成 11 位哈希码
keytool -exportcert -alias myalias -keystore /home/user/AndroidStudioProjects/LookAround/certificate.jks | xxd -p | tr -d "[:space:]" | echo -n com.root.lookAround `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
在生成 certificate.jks 文件时保持别名名称与您提供的相同,即 myalias。当它会要求您输入密码时,请提供“mypassword”,您就完成了。将此 11 位哈希码发送到服务器并将其嵌入到短信格式中。