Для вызова требуется разрешение, которое может быть отклонено пользователем: - PullRequest
0 голосов
/ 24 января 2019

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

Для вызова требуется разрешение, которое может быть отклонено пользователем: код должен явно проверять, доступно ли разрешение (с checkPermission) или явно обрабатывать потенциальныйSecurityException less ... (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() ) );

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

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Чтобы получить идентификатор устройства, вам нужно добавить строку ниже в манифесте <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();  
}
0 голосов
/ 24 января 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, в противном случае вы получите сбой вашего приложения.

0 голосов
/ 24 января 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 устройствапрограммно в андроид?

...