androidcontactpicker

Android contact picker returning nulll (resultCode == 0)


I'm new to Android and I'm trying to attach a contact picker to a form. This "contact picker code" works well when I test it with other forms but with this form, the resultCode = RESULT_CANCELED. I have checked other examples, but it doesn't work with this from but still works with other forms.

public class EmergencyButtonActivity extends Activity {
static private MoreEditText mPhonesMoreEditText = null;
private static final String DEBUG_TAG = "EmergencyButtonActivity";
private static final int CONTACT_PICKER_RESULT = 1001;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ExceptionHandler.register(this, new StackMailer());
     setContentView(R.layout.main);

}

public void doLaunchContactPicker(View view) {
    Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
            Contacts.CONTENT_URI);
    startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);
}

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
            case CONTACT_PICKER_RESULT:
                Cursor cursor = null;
                String phone = "";
                try {

                    Uri result = data.getData();
                    Log.v(DEBUG_TAG, "Got a contact result: "
                            + result.toString());

                    // get the contact id from the Uri
                    String id = result.getLastPathSegment();

                    // query for everything email
                    cursor = getContentResolver().query(Phone.CONTENT_URI,
                            null, Phone.CONTACT_ID + "=?", new String[] { id },
                            null);

                    int emailIdx = cursor.getColumnIndex(Phone.DATA);

                    // let's just get the first phone
                    if (cursor.moveToFirst()) {

                        phone = cursor.getString(emailIdx);

                        Log.v(DEBUG_TAG, "Got email: " + phone);

                    } else {
                        Log.w(DEBUG_TAG, "No results");
                    }
                } catch (Exception e) {
                    Log.e(DEBUG_TAG, "Failed to get email data", e);
                } finally {
                    if (cursor != null) {
                        cursor.close();
                    }
                    EditText txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo);
                    txtPhoneNo.setText(phone);
                    if (phone.length() == 0) {
                        Toast.makeText(this, "No number found for contact.",
                                Toast.LENGTH_LONG).show();
                    }
                    else{

                        Toast.makeText(getBaseContext(), "Phone : "+ phone, Toast.LENGTH_LONG).show();

                    }

                }

                break;
            }

        } else {
            Log.w(DEBUG_TAG, "Warning: activity result not ok");
        }
    }


private void popup(String title, String text) {
    AlertDialog.Builder builder = new AlertDialog.Builder(EmergencyButtonActivity.this);
    builder.setMessage(text)
           .setTitle(title)
           .setCancelable(true)
           .setPositiveButton("ok", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   dialog.cancel();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();
}

private void initUI() {
    setContentView(R.layout.main);

    this.restoreTextEdits();

    ImageButton btnEmergency = (ImageButton) findViewById(R.id.btnEmergency);
    btnEmergency.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // try sending the message:
            EmergencyButtonActivity.this.redButtonPressed();
        }
    });

    ImageButton btnHelp = (ImageButton) findViewById(R.id.btnHelp);
    btnHelp.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            popupHelp();
        }
    });



}

public void popupHelp() {


    final String messages [] = {
            "Welcome To App xxxxxx",
            "XXXXXXXXXXXXXXXXXXXXXXX",
            "XXXXXXXXXXXXXXXXXXXXXXXX."

        };

    // inverted order - They all popup and you hit "ok" to see the next one.
    popup("3/3", messages[2]);
    popup("2/3", messages[1]);
    popup("1/3", messages[0]);      
}

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    initUI();
}


private class StackMailer implements ExceptionHandler.StackTraceHandler {
    public void onStackTrace(String stackTrace) {
        EmailSender.send("a@zzz.com", "Error", "ButtonError\n" + stackTrace);
    }
}

@Override
protected void onStart()
{
    super.onStart();
}


@Override
protected void onResume()
{
    super.onResume();
    initUI();
    //IntroActivity.openOnceAfterInstallation(this);
    helpOnceAfterInstallation();
}


@Override
protected void onPause() {
    super.onPause();

    this.saveTextEdits();
}

@Override
protected void onStop() {
    super.onStop();
}   



public void helpOnceAfterInstallation() {
    // runs only on the first time opening
    final String wasOpenedName = "wasOpened";
    final String introDbName = "introActivityState";
    SharedPreferences settings = this.getSharedPreferences(introDbName, Context.MODE_PRIVATE);
    boolean wasOpened = settings.getBoolean(wasOpenedName, false);

    if (wasOpened) {
        return;
    }

    // mark that it was opened once
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean(wasOpenedName, true);
    editor.commit();



    popupHelp();
}   

private class EditTextRow {
    LinearLayout mLinlay;
    EditText mEditText;
    ImageButton mRemoveBtn;

    public EditTextRow(String text, EditText example) {
        mEditText = new EditText(EmergencyButtonActivity.this);

        mEditText.setLayoutParams(example.getLayoutParams());
        mEditText.setText(text);

        mEditText.setInputType(example.getInputType());

        mRemoveBtn = new ImageButton(EmergencyButtonActivity.this);
        mRemoveBtn.setBackgroundResource(R.drawable.grey_x);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;
        mRemoveBtn.setLayoutParams(params);

        mLinlay = new LinearLayout(EmergencyButtonActivity.this);
        mLinlay.setOrientation(LinearLayout.HORIZONTAL);
        mLinlay.addView(mEditText);
        mLinlay.addView(mRemoveBtn);
    }
}

private class MoreEditText {
    private LinearLayout mContainer;
    private ArrayList<EditText> mEditTextList = null;

    public MoreEditText(LinearLayout container, EditText textWidget, List<String> stringsList) {
        // Create the rows from scratch, this should only happen onCreate

        mContainer = container;
        mEditTextList = new ArrayList<EditText>();

        EditText edit;

        edit = textWidget;
        if(! stringsList.isEmpty()) {
            edit.setText(stringsList.get(0));
        }
        mEditTextList.add(edit);
        for (int i = 1; i < stringsList.size(); i++) {
            addRow(stringsList.get(i));
        }
    }

    public void restore(LinearLayout container, EditText textWidget, List<String> stringsList) {
        // Create the rows from older existing rows, this can happen on
        // changes of orientation, onResume, etc
        mContainer = container;

        for(int i = 0; i < mEditTextList.size(); i++) {
            EditText edit;
            if (i == 0) {

                edit = textWidget;
                mEditTextList.set(0, edit);
                if (stringsList.size() > 0) {
                    edit.setText(stringsList.get(0));
                }
            } else {
                edit = mEditTextList.get(i);
                View viewRow = (LinearLayout) edit.getParent();
                ((LinearLayout)viewRow.getParent()).removeView(viewRow);
                mContainer.addView(viewRow);
            }

        }
    }

    @SuppressWarnings("unused")
    public EditText getDefaultTextEdit(LinearLayout container) {
        // TODO: turn this into something like "getEditTextChild" rather than counting on the index "0"
        return (EditText) ((LinearLayout)container.getChildAt(0)).getChildAt(0);

    }

    public void removeRow(EditText editText) {
        mContainer.removeView((View) editText.getParent());
        mEditTextList.remove(editText);
    }

    public void addRow(String text) {
        final EditTextRow editRow = new EditTextRow(text, mEditTextList.get(0));
        editRow.mRemoveBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                MoreEditText.this.removeRow(editRow.mEditText);
            }
        });

        mContainer.addView(editRow.mLinlay);
        mEditTextList.add(editRow.mEditText);
    }

    public List<String> GetTexts() {
        ArrayList<String> texts = new ArrayList<String>(); 
        for (int i = 0; i < mEditTextList.size(); i ++) {
            texts.add(mEditTextList.get(i).getText().toString());
        }

        return texts;
    }


}

private void addPhonesEmailsUI(List<String> phones, List<String> emails) {
    LinearLayout phoneNoLin = (LinearLayout)findViewById(R.id.linPhoneNo);

    EditText txtPhoneNo = (EditText)findViewById(R.id.txtPhoneNo);

    // NOTE: we don't always create from scratch so that empty textboxes
    //      aren't erased on changes of orientation.
    if (mPhonesMoreEditText == null) {
        mPhonesMoreEditText = new MoreEditText(phoneNoLin, txtPhoneNo, phones);

    } else {
        mPhonesMoreEditText.restore(phoneNoLin, txtPhoneNo, phones);

    }


}


public void restoreTextEdits() {
    EmergencyData emergencyData = new EmergencyData(this);

    addPhonesEmailsUI(emergencyData.getPhones(), emergencyData.getEmails());
    EditText txtMessage = (EditText) findViewById(R.id.txtMessage);
    txtMessage.setText(emergencyData.getMessage());
}

@SuppressWarnings("unused")
public void saveTextEdits() {

    EditText txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo);
    EditText txtMessage = (EditText) findViewById(R.id.txtMessage);


    EmergencyData emergencyData = new EmergencyData(this);


    emergencyData.setPhones(mPhonesMoreEditText.GetTexts());

    emergencyData.setMessage(txtMessage.getText().toString());



    }



public void redButtonPressed() {
    this.saveTextEdits();
    EmergencyData emergency = new EmergencyData(this);

    if ((emergency.getPhones().size() == 0) && (emergency.getEmails().size() == 0)) {
        Toast.makeText(this, "Enter a phone number or email.",
                Toast.LENGTH_SHORT).show();
        return;
    }

    EmergencyActivity.armEmergencyActivity(this);
    Intent myIntent = new Intent(EmergencyButtonActivity.this, EmergencyActivity.class);
    EmergencyButtonActivity.this.startActivity(myIntent);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.ebutton_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Intent i = new Intent(Intent.ACTION_VIEW);  
    switch (item.getItemId()) {
    case R.id.project_page:
        i.setData(Uri.parse("http://#/"));  
        startActivity(i);
        break;

    case R.id.credits:
        Dialog dialog = new Dialog(this);

        dialog.setContentView(R.layout.credits_dialog);
        dialog.setTitle("Credits");

        TextView text = (TextView) dialog.findViewById(R.id.textView);
        try {
            Resources res = getResources();
            InputStream in_s = res.openRawResource(R.raw.credits);

            byte[] b = new byte[in_s.available()];
            in_s.read(b);
            text.setText(new String(b));
        } catch (Exception e) {
            // e.printStackTrace();
            text.setText("Error: can't show credits.");
        }           
        dialog.show();
        break;
    }
    return true;
}
}

Solution

  • Finally found a solution, the problem was with the android:launchMode in the manifest.