Ошибка генерируется
telephonyManager.getDeviceId()
Сначала вам нужно добавить в AdroidManifest.xml:
<uses-permission android:name="Manifest.permission.READ_PHONE_STATE" />
Начиная с SDK 24, разрешение необходимо запрашивать во время выполнения (при запуске приложения), и приложение вызывает диалог, запрашивающий разрешения.
Подробности объясняются здесь.
https://developer.android.com/training/permissions/requesting
Что вы должны делать в своем приложении:
// couple of members to be added in the Activity
//identify for what permission we ask
private static final int WANT_TO_READ_PHONE_STATE =1;
//flag to rememebr if permission granted or not, default is false
private boolean READ_PHONE_STATE_granted = false;
/* ask for permissions */
private void askForPermission(String permission, Integer requestCode) {
if (Build.VERSION.SDK_INT >= 23 &&
ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
//This is called if user has denied the permission before
//In this case I am just asking the permission again
ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);
} else {
/* if permission was requested in AndroidManifest.xml then it is automatically granted for SDK <=23 */
ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);
}
} else {
// on
READ_PHONE_STATE_granted = true;
}
}
/* Callback when user agreed/disagreed */
@Override
public void onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == WANT_TO_READ_PHONE_STATE) {
// check only the results
for( int i=0; i< grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
READ_PHONE_STATE_granted = true;
}
}
}
}
// ask for permissions somwhere in onCreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
askForPermission(Manifest.permission.READ_PHONE_STATE, WANT_TO_READ_PHONE_STATE);
/*... other code */
}
Теперь, когда вы вызываете getDeviceId, вы должны сначала проверить, является ли READ_PHONE_STATE_granted == true, в противном случае вы получите сбой вашего приложения.