мой apk отлично работает в режиме отладки. но когда я подписал apk с режимом выпуска, то не работает автоматическая отправка смс.
затем я ищу, я обнаружил, что мне нужно сгенерировать хеш-ключ в официальной документации https://developers.google.com/identity/sms-retriever/verify#generating_a_one-time_code
где я нашел два метода 1> по подписи помог класс - я использовал, но не работает 2> второй по следующей команде
keytool -exportcert -alias MyAndroidKey -keystore MyProductionKeys.keystore | ххд -р | tr -d "[:пробел:]" | echo -n com.example.myapp cat | ша256сум | tr -d "[:space:]-" | xxd -r -p | база64 | вырезать -c1-11
но у меня команда xxd не найдена
затем я ищу в стеке, затем я запускаю команду в git bash, команда запускается, но этот хеш-ключ все еще не работает
С помощью этого кода было бы проще сгенерировать хэш.
Просто позвоните ниже линии и распечатайте свою подпись.
ArrayList<String> sigList = (new AppSignatureHelper(this)).getAppSignatures()
Обновлять:
Хэш-код для отладочной и релизной версии будет отличаться. Убедитесь, что вы используете хэш-код конкретного приложения для otp-сообщения с требуемым форматом.
AppSignatureHelper предоставит хэш-код, с помощью которого будет подписан apk. Создайте apk выпуска и напечатайте хеш-код в журнале, чтобы получить хэш-код конкретного выпуска.
Обновлять:
Другой подход к генерации с помощью команды, упомянутой в: https://developers.google.com/identity/sms-retriever/verify#computing_your_apps_hash_string
Однако, если вы используете окна, это может не сработать, так как у вас нет двоичного кода (команды), такого как xxd или tr. в этом случае вам нужно скачать эти exe-файлы откуда-то еще.
Если вы используете git, вы можете найти их в «C:\Program Files\Git\usr\bin\», в этом случае выполните следующие действия.
keytool -exportcert -alias MY_ANDROID_KEY -keystore MY_PRODUCTION_KEY | xxd -p | tr -d "[:space:]" | echo -n MY_PACKAGE_NAMEкошка| sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
Где в команде
замените MY_PACKAGE_NAME на имя вашего пакета
Здесь, если вы столкнулись с ошибкой, такой как tr: write error: Illegal seek,
вы можете вызвать cammand до tr как ->
keytool -exportcert -alias MY_ANDROID_KEY -keystore MY_PRODUCTION_KEY | xxd -p | tr -d "[:space:]"
в этом случае вы получите строку подписи длиной около 1800+ символов. передайте пакет и строку подписи хэш-методу AppSignatureHelper, он вернет ваш ключ.
(Здесь, если в конце вы используете AppSignatureHelper, я предлагаю использовать только этот первый подход)
Что вы имели в виду под неработающим кодом вспомогательного класса подписи. Код для отладки и выпуска приложения будет отличаться. Убедитесь, что вы используете хэш-код выпуска приложения в сообщении otp.
спасибо, но не могли бы вы прислать мне разные ссылки для режима отладки и выпуска этого класса. когда я искал, нет определенного класса для режима выпуска и отладки.
нет нужды. Он будет читать из подписи, с помощью которой подписан apk. Распечатайте этот код в журнале после сборки apk в режиме выпуска.
Братан, которого я уже использовал, хэш-ключ такой же, как и при подписании apk в режиме отладки и выпуска. И как студия Android знает об apk, она знает только код. какое влияние на режим отладки или выпуска. апк совсем другой
Если вы получаете одинаковый хэш-код в обеих версиях, возможно, вы неправильно создаете свой релиз apk с помощью хранилища ключей выпуска. Хэш-код для отладки и выпуска не может быть одинаковым.
apk — это совершенно другое, предположим, я правильно сгенерировал подписанный apk, а не то, как android stuido запускает вспомогательный класс подписи в соответствии с режимом отладки или выпуска. Поскольку я знаю, что Android-студия не имеет никакого влияния на релиз или отладку apk, она только компилирует или запускает код.
означает, что, по вашему мнению, сначала я должен сгенерировать подписанный apk, а затем установить этот подписанный apk на телефон, а затем подключить этот телефон к студии Android с помощью USB, а затем распечатать журнал, который я сделал. но та же хеш-строка
@indrajeetjyoti Возможно, тогда релизный apk не собран должным образом. Проверьте обновленный ответ, если он может помочь.
import android.content.Context;
import android.content.ContextWrapper;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.util.Base64;
import android.util.Log;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
public class AppSignatureHelper extends ContextWrapper {
private static final String TAG = "AppSignatureHelper";
private static final String HASH_TYPE = "SHA-256";
public static final int NUM_HASHED_BYTES = 9;
public static final int NUM_BASE64_CHAR = 11;
public AppSignatureHelper(Context context) {
super(context);
}
/**
* Get all the app signatures for the current package
*/
public ArrayList<String> getAppSignatures() {
ArrayList<String> appCodes = new ArrayList<>();
try {
// Get all package signatures for the current package
String packageName = getPackageName();
PackageManager packageManager = getPackageManager();
Signature[] signatures = packageManager.getPackageInfo(packageName,
PackageManager.GET_SIGNATURES).signatures;
// For each signature create a compatible hash
for (Signature signature : signatures) {
String hash = hash(packageName, signature.toCharsString());
if (hash != null) {
appCodes.add(String.format("%s", hash));
}
}
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Unable to find package to obtain hash.", e);
}
return appCodes;
}
private static String hash(String packageName, String signature) {
String appInfo = packageName + " " + signature;
try {
MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE);
messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8));
byte[] hashSignature = messageDigest.digest();
// truncated into NUM_HASHED_BYTES
hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES);
// encode into Base64
String base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING | Base64.NO_WRAP);
base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR);
CommonUtils.base64Val = base64Hash;
Log.e("base64Val",base64Hash);
Log.d(TAG, String.format("pkg: %s -- hash: %s", packageName, base64Hash));
return base64Hash;
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, "hash:NoSuchAlgorithm", e);
}
return null;
}
}
Вы можете использовать base64hash для сборки отладки, и если вы запускаете приложение, создайте подписанный APK и используйте значение, сгенерированное из подписанного APK.
Не забудьте вызвать этот класс из основного приложения oncreate().
AppSignatureHelper appSignatureHelper = new AppSignatureHelper(this);
appSignatureHelper.getAppSignatures();
как вы генерируете ценность из подписанного apk
и ключ, сгенерированный из приведенного выше кода, не используется для API-интерфейса sms-ретривера. спасибо за предложение
Привет, Индраджит, я использовал API-интерфейс для извлечения SMS в своем приложении и использую то же значение, сгенерированное из приведенного выше кода, и загрузил приложение в магазин игр, и оно работает отлично.
его невозможный алгоритм генерации хеш-ключа ретривера смс совершенно другой
обратитесь к этому документу
Есть несколько способов создать это. Обратитесь к этому блогу. androidwave.com/automatic-sms-verification-android
я уже упоминал, что использовал этот класс, но вы все же скопируйте и вставьте класс, сначала прочитайте мой вопрос