суббота, 30 марта 2013 г.

The problem with an external camera in Android using MediaStore.ACTION_IMAGE_CAPTURE

We start native Camera using this code (short variant):

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, NUMBER);

Don't forget Manifest.xml

<activity
android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden"
</activity>

In  OnActivityResult we save information got from our external Camera, but after this in some devices we have this issue:
OnActivityResult
OnResume
OnPause
OnDestroy - there we lose all information from Camera
OnCreate
OnResume


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      mObject.setImagePath(....); - for example
}

Solution in two steps:

Step 1: Add OnSaveInstanceState and onRestoreInstanceState to your Class.

YourObject mObject = new YourObject();


@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  if(mObject != null) savedInstanceState.putSerializable(KEY, mObject);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  YourObject obj = (YourObject) savedInstanceState.getSerializable(KEY);
  if(obj != null) mObject = obj;
}


Step 2: Add piece of code to the OnCreate method.


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

YourObject obj = null;
try {
obj = (CarsDbModel) savedInstanceState.getSerializable(KEY);
} catch(NullPointerException e) {

}
 
if(car != null) {
      mObject = car;
}


After this code we will have this queue:
OnResume
OnPause
OnSaveInstanceState
OnDestroy
OnCreate - restore Correct Object

onRestoreInstanceState

OnResume


суббота, 28 апреля 2012 г.

Tips - TabWidget fixed width

I didn't find any info about TabWidget fixed with in XML.

Thats why I use this, after create TabHost and added all Tabs:

int dips = 100; //Width in dip

int pixels = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) dips, getResources().getDisplayMetrics());
TabWidget widget = mTabHost.getTabWidget();
for (int i = 0; i < widget.getChildCount(); ++i) {
     View v = widget.getChildAt(i);
     v.getLayoutParams().width = pixels;

}



  

суббота, 11 июня 2011 г.

Получение email из контактной книги Android

Строка такого вида чтоб получить список email не работает, хотя во многих статьях ее используют:

Intent intent=new Intent(Intent.ACTION_PICK);
intent.setData(ContactsContract.CommonDataKinds.Email.CONTENT_URI);
startActivityForResult(intent, some_number);

Видимо работала до версии < Android 2.0, так что пришлось чуть по шаманить, вариант получился не лучший так как мы не видим сам mail а видим только контакт.
Если у вас есть вариант как увидеть mail в контакт листе напишите в комментариях.
Код:
//Какой то обработчик нажатия
public boolean onLongClick(View arg0) {
Uri a = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

Intent i=new Intent(Intent.ACTION_PICK, a);
startActivityForResult(i, PICK_REQUEST_MAIL); }
...
//Получаем результат

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if ((requestCode == PICK_REQUEST_MAIL) && (resultCode == RESULT_OK)) {
ContentResolver cr = getContentResolver();
Cursor pCur_id = cr.query(data.getData(), null, null, null, null);
        String id = null;
if(pCur_id != null)
 while (pCur_id.moveToNext()) {
 id = pCur_id.getString(pCur_id.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
       }
pCur_id.close();
//Важная строка, по ID контакта находим наш MAIL в запросе.
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID+ "=" + id, null, null);

if(pCur != null)
 while (pCur.moveToNext()) {
String mail = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
//Тут заносим наш mail куда нам надо например в EditText
        mailEditText.setText(mail);
 }
         pCur.close();
        }
        super.onActivityResult(requestCode, resultCode, data);
    }