2016-07-23 21 views
-2

Ich versuche eine App zu erstellen, die die SIM-Kartennummer, die IMEI-Nummer und die Telefonnummer enthält. Allerdings, wenn ich es bekomme ich folgende Fehlermeldung:Erhalten von java.lang.SecurityException beim Anfordern von SIM-Informationen

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 

Ich habe die Erlaubnis im Manifest geschrieben:

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

Hier ist mein Code für die App:

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 :

Das ist mein Manifest:

<?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

Sie müssen die Erlaubnis zur Laufzeit anfordern –

+0

@ OneStepBack: Ich habe das getan. Habe das OP bearbeitet. Bitte überprüfen Sie es –

+0

Können Sie den Teil, wo Sie das getan haben? –

Antwort

3

Fügen Sie Ihrer Methode onCreate den folgenden Code hinzu, wenn Sie Ihre Anwendung unter Android 6.x oder höher ausführen.

 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 ist eine Konstante, die Sie definieren, um diese Anfrage zu identifizieren.

Dadurch wird ein Anfrage-Erlaubnisdialogfeld für Benutzer geöffnet, wenn die Berechtigung nicht erteilt wird. Sie können dann verfolgen, ob die Berechtigung erteilt wurde oder nicht, indem Sie die folgende Methode überschreiben.

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

Basierend auf dem Berechtigungsstatus können Sie dann den Rest Ihres Codes ausführen.

+0

Muss ich CONST_ID als Integer definieren? –

+0

Ja, es ist eine ganze Zahl. Du kannst auch bei der Methodendefinition auf Google-Entwickler zugreifen. Definieren Sie einen eindeutigen Wert, damit Sie diesen Wert in onRequestPermissionResult überprüfen können, und identifizieren Sie, dass der Rückruf für welche Berechtigungsanforderung aufgerufen wird. – chejaras