2016-07-23 5 views
-2

Я пытаюсь создать приложение, которое дает номер SIM-карты, номер IMEI и номер телефона. Однако, когда я это делаю, я получаю следующее сообщение об ошибке:Получение java.lang.SecurityException при запросе информации о SIM-карте

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hadi.sim_info/com.example.hadi.sim_info.MainActivity}: java.lang.SecurityException: getLine1NumberForDisplay: Neither user 10034 nor current process has android.permission.READ_SMS 

Я написал разрешение в манифесте:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

Вот мой код приложения:

public class MainActivity extends AppCompatActivity { 

    TextView tlf, sim, IMEI; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     tlf = (TextView) findViewById(R.id.Tlf_nr); 
     sim = (TextView) findViewById(R.id.sim); 
     IMEI = (TextView) findViewById(R.id.IMEI); 

     TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
     String number = tm.getLine1Number(); 
     String simNR = tm.getSimSerialNumber(); 
     String IMEINR = tm.getDeviceId(); 

     tlf.setText("Tlf. Nr.: "+number); 
     sim.setText("SIM Nr.: "+simNR); 
     IMEI.setText("IMEI Nr.: "+ IMEINR); 
    } 
} 

EDIT :

Это мой манифест:

<?xml version="1.0" encoding="utf-8"?> 
<manifest package="com.example.hadi.sim_info" 
      xmlns:android="http://schemas.android.com/apk/res/android"> 

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

Необходимо запросить разрешение во время выполнения –

+0

@OneStepBack: Я сделал это. Редактировал ОП. Пожалуйста, отметьте это –

+0

Можете ли вы разместить часть, где вы это сделали? –

ответ

3

Добавьте следующий код в метод onCreate своей деятельности, если вы используете приложение на Android 6.x или выше.

 if (ActivityCompat.checkSelfPermission(this, 
       Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.READ_PHONE_STATE}, 
        CONST_ID); 
     } 

CONST_ID - это константа, которую вы определяете для идентификации этого запроса.

Это приведет к появлению окна разрешения запроса пользователю, если разрешение не предоставлено. Затем вы можете отслеживать, было ли разрешение предоставлено или нет, переопределив следующий метод.

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 

Основываясь на состоянии разрешения, вы можете выполнить остаток кода.

+0

Должен ли я определять CONST_ID как целое число? –

+0

Да его целое число. Вы также можете указать определение метода для разработчика Google. Определите уникальное значение, чтобы вы могли проверить это значение в onRequestPermissionResult и определить, что обратный вызов вызывается, для которого запрашивается разрешение. – chejaras