Для вызова требуется разрешение, которое может быть отклонено пользователем:

Я получаю сообщение об ошибке ниже кода

Для вызова требуется разрешение, которое может быть отклонено пользователем: код должен явно проверять, доступно ли разрешение (с помощью checkPermission), или явно обрабатывать потенциальное исключение SecurityException меньше ... (Ctrl + F1)

Информация о проверке: эта проверка просматривает ваш код и библиотеки, проверяет используемые API и сравнивает их с набором разрешений, необходимых для доступа к этим API. Если код, использующий эти API, вызывается во время выполнения, программа выйдет из строя.

Кроме того, для разрешений, которые можно отозвать (с targetSdkVersion 23), клиентский код также должен быть подготовлен для обработки вызовов, вызывающих исключение, если пользователь отклоняет запрос на разрешение во время выполнения. Идентификатор проблемы: MissingPermission

Код:

@SuppressWarnings( "deprecation" )
    void setDeviceImei() {
        TelephonyManager telephonyManager = ( TelephonyManager ) getSystemService( Context.TELEPHONY_SERVICE );
        Utils.setIMEI( context, String.valueOf( telephonyManager.getDeviceId() ) );
        WifiManager wm = ( WifiManager ) getApplicationContext().getSystemService( WIFI_SERVICE );
        String ip = Formatter.formatIpAddress( wm.getConnectionInfo().getIpAddress() );
        Utils.setIpAddress( context, ip );
        int v = 0;
        try {
            v = context.getPackageManager().getPackageInfo( context.getPackageName(), 0 ).versionCode;
            Utils.setVersionCode( context, v );
        }
        catch( NameNotFoundException e ) {
            e.printStackTrace();
        }
        if( !Utils.isConnectingToInternet( context ) ) {
            alertpopup( context, context.getResources().getString( R.string.no_internet ) );
            return;
        } else {
            timer = new Timer();
            timer.schedule( new TimerTask() {
                public void run() {
                    callValidateImeiApi();
                    timer.cancel();
                    timer = null;
                }
            }, 500 );
        }
    }

Ошибка в строке ниже:

Utils.setIMEI( context, String.valueOf( telephonyManager.getDeviceId() ) );

Пожалуйста, помогите его очистить!


person Hazem Khaled    schedule 24.01.2019    source источник


Ответы (3)


Чтобы получить идентификатор устройства, вам нужно будет добавить строку ниже в манифест <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Для Android 6.0 и более поздних версий вам нужно будет явно запросить разрешение, прежде чем вы сможете использовать TelephonyManager. Также getDeviceId устарел для Android O, поэтому используйте следующее:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {  
      //getDeviceId() is Deprecated so for android O we can use getImei() method  
      return telephonyManager.getImei();  
}  
else {  
      return telephonyManager.getDeviceId();  
}
person Shahnawaz Ansari    schedule 24.01.2019

Ошибка генерируется

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, иначе вы получите сбой вашего приложения.

person Marcel Preda    schedule 24.01.2019

telephonyManager.getDeviceId () Этот метод устарел на уровне API 26 https://developer.android.com/reference/android/telephony/TelephonyManager#getDeviceId()

Попробуйте вместо этого

@RequiresApi(api = Build.VERSION_CODES.O)
 TelephonyManager tm = (TelephonyManager)
            getSystemService(this.TELEPHONY_SERVICE);
    String imei = tm.getImei();

Также см. Как получить IMEI / ESN устройства. программно в android?

person nyulan    schedule 24.01.2019