2016-05-20 1 views
1

Je dois être capable de lire le nom APN actuel. Mon application est une application système (elle se trouve sous/system/app) et j'ai un accès root.Lire le nom APN actuel du code [racine]

J'essaie d'obtenir le nom APN, mais il est impossible d'être parce que je suis toujours invité à:

No permission to write APN settings 

J'ai également ajouté les autorisations suivantes dans Android Manifest

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

CIBLE SDK> 18 (Lollipop)

Merci beaucoup.

+0

autorisations d'exécution, peut-être? Quelle est votre cible sdk? – 1615903

+0

targetSdkVersion 21 – Aldridge1991

Répondre

0

WRITE_APN_SETTINGS

Ne pas utiliser par des applications tierces. Vous ne pouvez pas lire les paramètres APN dans API > 18.

Pour API < = 18

public class APNHelper { 

    private Context context; 

    public APNHelper(final Context context) { 
     this.context = context; 
    } 

    @SuppressWarnings("unchecked") 
    public List<APN> getMMSApns() { 
     final Cursor apnCursor = this.context.getContentResolver() 
       .query(Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, 
         "current"), null, null, null, null); 
     if (apnCursor == null) { 
      return Collections.EMPTY_LIST; 
     } else { 
      final List<APN> results = new ArrayList<APN>(); 
      if (apnCursor.moveToFirst()) { 
       do { 
        final String type = apnCursor.getString(apnCursor 
          .getColumnIndex(Telephony.Carriers.TYPE)); 
        if (!TextUtils.isEmpty(type) 
          && (type.equalsIgnoreCase("*") || type 
          .equalsIgnoreCase("mms"))) { 
         final String mmsc = apnCursor.getString(apnCursor 
           .getColumnIndex(Telephony.Carriers.MMSC)); 
         final String mmsProxy = apnCursor.getString(apnCursor 
           .getColumnIndex(Telephony.Carriers.MMSPROXY)); 
         final String port = apnCursor.getString(apnCursor 
           .getColumnIndex(Telephony.Carriers.MMSPORT)); 
         final APN apn = new APN(); 
         apn.MMSCenterUrl = mmsc; 
         apn.MMSProxy = mmsProxy; 
         apn.MMSPort = port; 
         results.add(apn); 

         Toast.makeText(context, 
           mmsc + " " + mmsProxy + " " + port, 
           Toast.LENGTH_LONG).show(); 
        } 
       } while (apnCursor.moveToNext()); 
      } 
      apnCursor.close(); 
      return results; 
     } 
    } 
} 
+0

Je ne comprends pas comment cela peut être possible. Même en tant qu'application système et avec les privilèges root? – Aldridge1991

+0

vous 'pouvez' lire le réglage APN dans API <19 et' cannot' lire dans greator alors API> 18. ce que vous ne comprenez vraiment pas? –

+0

Pourquoi cela se produit-il – Aldridge1991

1

Android 5.1 Privilèges Carrier introduit (https://source.android.com/devices/tech/config/uicc).

Pour pouvoir modifier l'APN, vous devez signer votre application avec la même signature que la carte SIM. Si vous faites cela, il est alors possible de changer l'APN. Vous n'avez pas besoin du

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

dans le manifeste Android.

Vous pouvez signer votre application avec Android Studio (exemple https://developer.android.com/studio/publish/app-signing.html)

+0

Comment faire J'ai la signature de la carte SIM? Le transporteur l'aurait-il? Pouvez-vous me montrer plus d'informations sur la signature de la carte SIM? Je veux savoir ce que je peux faire d'autre si j'ai accès à la signature SIM .. merci –

+1

La carte est signée par le transporteur. Il ne le fournira à personne en dehors du transporteur car il s'agit d'une signature de haute sécurité. – pringi

+0

Merci. J'ai l'apk signé par le transporteur. Je devrais maintenant être capable de lire, écrire APN? A quoi d'autre ai-je accès avec une carte signée? –