1

I have searched and looked into this issue all over the web but did not get a clear answer. I have added the words to the user dictionary using content provider as the android documentation states the words gets added but after that when i type onto the keypad i don't see the word appearing on the suggestions in candidates view as other words that we tap appear there next time. I would really appreciate a full answer to this problem as many people are asking it on the net and not getting answered. I have tried this

    Uri mNewUri;
    // Defines an object to contain the new values to insert
    ContentValues mNewValues = new ContentValues();

     // Sets the values of each column and inserts the word. The arguments to the "put"
     // method are "column name" and "value"

    mNewValues.put(UserDictionary.Words.APP_ID, "example.user");
    mNewValues.put(UserDictionary.Words.LOCALE, "en_US");
    mNewValues.put(UserDictionary.Words.WORD, "Qasim");
    mNewValues.put(UserDictionary.Words.FREQUENCY, "100");

    mNewUri = getContentResolver().insert(
        UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI
        mNewValues                          // the values to insert
    );


    Uri dic = UserDictionary.Words.CONTENT_URI;
    ContentResolver resolver = getContentResolver();
    Cursor cursor = resolver.query(dic, null, null, null, null);
 //here i retrieve all the words stored into my dictionary
    while (cursor.moveToNext()){
       String word = cursor.getString(cursor.getColumnIndex(UserDictionary.Words.WORD));
       int id = cursor.getInt(cursor.getColumnIndex(UserDictionary.Words._ID));
       String app = cursor.getString(cursor.getColumnIndex(UserDictionary.Words.APP_ID));
       int frequency = cursor.getInt(cursor.getColumnIndex(UserDictionary.Words.FREQUENCY));
       String locale = cursor.getString(cursor.getColumnIndex(UserDictionary.Words.LOCALE));
       Log.i("", "word: "+word+"\nId: "+id+"\nAppID: "+app+"\nfrequency: "+frequency+"\nLocale:"+locale);
    }

Would appreciate if someone helps me out here

Syed Wajahat Ali
  • 541
  • 1
  • 7
  • 25

1 Answers1

1

If the keyboard you are using reads the user dictionary, you should be able to add words to the dictionary as the documentation says, using the resolver.insert.

I added some words manually using the default keyboard. Using the resolver.query the new words are listed on the output. The keyboard is adding new words to the dictionary.

Afterwards, I added a single word to the dictionary (Quasimodo) using the resolver.insert. The word was added to the dictionary (it appears in the resolver.query output) and it also appears as a suggestion on the keyboard.

If I switch to another keyboard (Swiftkey for example), these words are not used for prediction. Maybe you are using some different keyboard.

My full code is:

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Get the TextView which will be populated with the Dictionary ContentProvider data.
        TextView dictTextView = (TextView) findViewById(R.id.dictionary_text_view);
        // Get the ContentResolver which will send a message to the ContentProvider
        ContentResolver resolver = getContentResolver();
        // Put a new word on the dictionary
        final Locale locale;
        locale = Locale.getDefault();
        final int COLUMN_COUNT = 3;
        ContentValues values = new ContentValues(COLUMN_COUNT);
        values.put(Words.WORD, "Quasimodo");
        values.put(Words.FREQUENCY, 250);
        values.put(Words.LOCALE, locale.toString());
        Uri result = resolver.insert(UserDictionary.Words.CONTENT_URI, values);

        // Get a Cursor containing all of the rows in the Words table
        // The word "Quasimodo" inserted will be shown
        Cursor cursor = resolver.query(UserDictionary.Words.CONTENT_URI, null, null, null, null);
        // Surround the cursor in a try statement so that the finally block will eventually execute
        try {
            dictTextView.setText("UserDictionary contains " + cursor.getCount() + " words\n");
            dictTextView.append("COLUMNS: " + Words._ID  + " - " + Words.FREQUENCY +
                    " - " + Words.WORD);
            int idColumn = cursor.getColumnIndex(UserDictionary.Words._ID);
            int frequencyColumn = cursor.getColumnIndex(UserDictionary.Words.FREQUENCY);
            int wordColumn = cursor.getColumnIndex(UserDictionary.Words.WORD);
            while (cursor.moveToNext()) {
                int id = cursor.getInt(idColumn);
                int frequency = cursor.getInt(frequencyColumn);
                String word = cursor.getString(wordColumn);
                dictTextView.append(("\n" + id + " - " + frequency + " - " + word));
            }
        } finally {
            cursor.close();
        }
    }
}

My keyboard show the word insert as a suggestion afterwards.

enter image description here

jgrocha
  • 2,912
  • 1
  • 28
  • 31