Ошибка контрольной суммы при подготовке Android Lollipop
я получил сообщение Couldn't use the admin app due to a checksum error. Contact your IT department
при использовании кода ниже. В основном у вас есть два устройства Android Lollipop. Одно устройство удаляется (сброс) и другое имеет это приложение программирования на нем. Приложение программирования отправляет команду NFC на недоказанное устройство, чтобы сообщить ему начать подготовку с использованием данных, которые вы передаете ему. Требуется три поля (местоположение APK, контрольная сумма файла APK и имя пакета) в соответствии с DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC.
APK загружается. Я проверяю свои журналы сервера, и это явно исходит от устройства (AndroidDownloadManager
В агент пользователя).
согласно DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM это контрольная сумма SHA-1 файла. Контрольная сумма не совпадает. Я пробовал много разных форматов этой контрольной суммы (hex, hex с пробелами, верхний / нижний регистр, base64, текст) и я думаю, возможно, я пропустил тест.
к сожалению, источник Android Lollipop еще не доступен, иначе я бы проверял там.
как это исправить? Есть мысли?
public class ProvisionerActivity extends Activity implements CreateNdefMessageCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcAdapter.setNdefPushMessageCallback(this, this);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
try {
Properties p = new Properties();
p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.example.deviceownertest");
p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, "http://example.com/DeviceOwnerTest.apk");
p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, "19138948d8a607617971af724ffd08dd7eab771b");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream out = new ObjectOutputStream(bos);
p.store(out, "");
byte[] bytes = bos.toByteArray();
NdefMessage msg = new NdefMessage(NdefRecord.createMime(DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, bytes));
return msg;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Примечание: это использование последней Предварительный Просмотр Разработчика Android L. Я думаю, вполне возможно, что эта функция еще не закончена.
Update: фактический выпуск действует таким образом тоже.
APK: https://storage.googleapis.com/randy/DeviceOwnerCheck.apk
Checksum: FRaAsqdPSjp9nC5hKIU / ElPv+e4
результат: использование этого URL-адреса и этой контрольной суммы дает ошибку и даже не попадает на экран шифрования устройства.
Я также разместил два приложения в GitHub. Один отправляет данные NFC для обеспечения. Другой-это просто приложение для проверьте, является ли приложение администратором устройства или владельцем устройства. Надеюсь, кто-то найдет это полезным. Вам нужно будет изменить URL и контрольную сумму, если вы хотите построить DeviceOwnerCheck самостоятельно.
3 ответов
хэш-код должен быть безопасным url. Это преобразует и удаляет trailing padding
$ cat Something.apk | openssl dgst -binary -sha1 | openssl base64 | tr '+/' '-_' | tr -d '='
похоже, что ему не нравятся специальные символы в контрольной сумме. Я смог заставить его работать с моим файлом apk, но контрольная сумма не имела никаких специальных символов. Когда я попытался использовать ваш файл apk, я получил ту же ошибку. Попробуйте воссоздать apk, пока у него нет специальных символов, и тогда он должен работать.
Я предполагаю, что есть какой-то побег специальных символов, которые отсутствуют.
вот команда для получения хэш-кода.
$ cat Something.apk | openssl dgst -binary -sha1 | openssl base64
кроме того, удалите все прокладки трала (=).