Android 4.2.1 - Mise à jour d'une colonne dans la base de données des paramètres APN Programmatiquement

StackOverflow https://stackoverflow.com//questions/24054893

  •  22-12-2019
  •  | 
  •  

Question

Je tente de mettre à jour la colonne "Nom" de la table de base de données APN préférée figurant dans l'emplacement: Contenu: // Téléphonie / transporteurs / préféverises. Cependant, le contenu de mon application () renvoie toujours 0, ce qui signifie qu'aucune lignée n'a été mise à jour. J'ai déjà un accès root pour l'application et l'ai confirmé de manière programmatique avant d'exécuter la mise à jour ().

Les détails sur les colonnes de table peuvent être trouvés ici et Ici . Je me suis également assuré de référencer le Documentation sur la manière 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_setstings" dans le fichier manifeste:

ai-je appelé la fonction de mise à jour incorrectement pour mon objectif particulier? Ou utilise la mise à jour () la mauvaise façon d'y aller?

Était-ce utile?

La solution

Cette question est morte depuis près d'un mois maintenant, mais j'ai fait une solution de contournement pour cette question et je voulais le partager.La solution de contournement consiste à copier l'entrée d'APN préférée existante à l'exclusion du champ Nom, insérant la nouvelle APN dans la liste des opérateurs, puis définissant le nouvel APN comme préféré à l'aide de 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:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top