2014-06-05 1 views
2

Je tente de mettre à jour la colonne 'name' de la table de base de données APN préférée à l'emplacement: content: // telephony/carriers/preferapn. Toutefois, ContentResolver.update() de mon application renvoie toujours 0, ce qui signifie qu'aucune ligne n'a été mise à jour. J'ai déjà un accès root pour l'application et je l'ai confirmé par programme avant d'exécuter update().Android 4.2.1 - Mise à jour par programmation d'une colonne dans la base de données des paramètres APN

Vous trouverez des détails sur les colonnes de table here et here. J'ai également veillé à référencer le documentation sur la façon dont la fonction de mise à jour est appelée.

La méthode de mise à jour:

public boolean setAPN(String newAPN, TextView t){ 

    //get URI objects for the tables 
    final Uri APN_TABLE_URI = Uri.parse("content://telephony/carriers"); 
    final Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); 

    //Confirm permissions 
    PackageManager pm = getPackageManager(); 
    if (pm.checkPermission(permission.WRITE_APN_SETTINGS, getPackageName()) == PackageManager.PERMISSION_GRANTED) { 

     //Update name field 
     ContentResolver resolver = this.getContentResolver(); 
     ContentValues values = new ContentValues();   
     values.put("name", newAPN); 
     long rc = resolver.update(PREFERRED_APN_URI, values, null, null); 

     //Display the row contents (always has the original fields, doesn't update) 
     Cursor c = getContentResolver().query(PREFERRED_APN_URI, null, null, null, null); 
     c.moveToFirst();   
     int index = c.getColumnIndex("_id"); //getting index of required column 
     Short id = c.getShort(index);   //getting APN's id from   
     index = c.getColumnIndex("name"); 
     String name = c.getString(index);   
     index = c.getColumnIndex("mcc"); 
     String mcc = c.getString(index);   
     index = c.getColumnIndex("mnc"); 
     String mnc = c.getString(index);   
     index = c.getColumnIndex("numeric"); 
     String numeric = c.getString(index); 

     t.setText(" ID:" + id + "\n" + 
       " APN Name: " + name + "\n" + 
       " MCC: " + mcc + "\n" + 
       " MNC: " + mnc + "\n" + 
       " Numeric: " + numeric + "\n" 

      ); 

    } else { 
     t.setText(" You don't have permission to do this. ");  
    } 

    return true; 
} 

Comme mentionné précédemment, j'ai aussi la permission: « android.permission.WRITE_APN_SETTINGS » dans le fichier manifeste:

J'ai appelé la fonction de mise à jour de façon incorrecte pour mon raison particulière? Ou utilise update() dans le mauvais sens?

Répondre

3

Cette question est morte depuis presque un mois maintenant, mais j'ai fait une solution de contournement pour ce problème et je voulais le partager. La solution de contournement consiste à copier l'entrée APN préférée existante en excluant le champ de nom, en insérant le nouvel APN dans la liste de porteuse, puis en définissant le nouvel APN comme préféré en utilisant l'ID nouvellement généré.

public int InsertAPN(String name){  

    //Set the URIs and variables 
    int id = -1; 
    boolean existing = false; 
    final Uri APN_TABLE_URI = Uri.parse("content://telephony/carriers"); 
    final Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); 

    //Check if the specified APN is already in the APN table, if so skip the insertion      
    Cursor parser = getContentResolver().query(APN_TABLE_URI, null, null, null, null); 
    parser.moveToLast();    
    while (parser.isBeforeFirst() == false){ 
     int index = parser.getColumnIndex("name"); 
     String n = parser.getString(index); 
     if (n.equals(name)){ 
      existing = true; 
      Toast.makeText(getApplicationContext(), "APN already configured.",Toast.LENGTH_SHORT).show(); 
      break; 
     }    
     parser.moveToPrevious(); 
    }  

    //if the entry doesn't already exist, insert it into the APN table  
    if (!existing){   

      //Initialize the Content Resolver and Content Provider 
      ContentResolver resolver = this.getContentResolver(); 
      ContentValues values = new ContentValues(); 

      //Capture all the existing field values excluding name 
      Cursor apu = getContentResolver().query(PREFERRED_APN_URI, null, null, null, null); 
      apu.moveToFirst();     
      int index;  

      index = apu.getColumnIndex("apn"); 
      String apn = apu.getString(index);    
      index = apu.getColumnIndex("type"); 
      String type = apu.getString(index);    
      index = apu.getColumnIndex("proxy"); 
      String proxy = apu.getString(index);    
      index = apu.getColumnIndex("port"); 
      String port = apu.getString(index);    
      index = apu.getColumnIndex("user"); 
      String user = apu.getString(index);    
      index = apu.getColumnIndex("password"); 
      String password = apu.getString(index);    
      index = apu.getColumnIndex("server"); 
      String server = apu.getString(index);     
      index = apu.getColumnIndex("mmsc"); 
      String mmsc = apu.getString(index);    
      index = apu.getColumnIndex("mmsproxy"); 
      String mmsproxy = apu.getString(index);    
      index = apu.getColumnIndex("mmsport"); 
      String mmsport = apu.getString(index);    
      index = apu.getColumnIndex("mcc"); 
      String mcc = apu.getString(index);    
      index = apu.getColumnIndex("mnc"); 
      String mnc = apu.getString(index);    
      index = apu.getColumnIndex("numeric"); 
      String numeric = apu.getString(index); 

      //Assign them to the ContentValue object 
      values.put("name", name); //the method parameter 
      values.put("apn", apn);     
      values.put("type", type); 
      values.put("proxy", proxy); 
      values.put("port", port); 
      values.put("user", user); 
      values.put("password", password); 
      values.put("server", server); 
      values.put("mmsc", mmsc); 
      values.put("mmsproxy", mmsproxy); 
      values.put("mmsport", mmsport);    
      values.put("mcc", mcc); 
      values.put("mnc", mnc); 
      values.put("numeric", numeric);    

      //Actual insertion into table 
      Cursor c = null; 
      try{ 
       Uri newRow = resolver.insert(APN_TABLE_URI, values); 

       if(newRow != null){ 
        c = resolver.query(newRow, null, null, null, null); 
        int idindex = c.getColumnIndex("_id"); 
        c.moveToFirst(); 
        id = c.getShort(idindex);      
       } 
      } 
      catch(SQLException e){} 
      if(c !=null) c.close();   
    } 

    return id; 
} 

//Takes the ID of the new record generated in InsertAPN and sets that particular record the default preferred APN configuration 
public boolean SetPreferredAPN(int id){ 

    //If the id is -1, that means the record was found in the APN table before insertion, thus, no action required 
    if (id == -1){ 
     return false; 
    } 

    Uri.parse("content://telephony/carriers"); 
    final Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); 

    boolean res = false; 
    ContentResolver resolver = this.getContentResolver(); 
    ContentValues values = new ContentValues(); 

    values.put("apn_id", id); 
    try{ 
     resolver.update(PREFERRED_APN_URI, values, null, null); 
     Cursor c = resolver.query(PREFERRED_APN_URI, new String[]{"name", "apn"}, "_id="+id, null, null); 
     if(c != null){ 
      res = true; 
      c.close(); 
     } 
    } 
    catch (SQLException e){} 
    return res; 
} 

Vous pouvez ensuite appeler la méthode comme ceci:

int identity = InsertAPN(NEW_APN_NAME); 
SetPreferredAPN(identity); 
+0

C'est fou. Merci d'avoir partagé. –

Questions connexes