標籤:ase 訊息 欄位 upd fragment mst uid 查詢 支援
15.5 挑戰練習:ShareCompat第一個練習比較簡單。Android支援庫有個叫作 ShareCompat 的類,它有一個 IntentBuilder.ShareCompat.IntentBuilder 內部類。利用這個內部類建立用於發送訊息按鈕的 Intent 略微方便一些。因此,你要接受的挑戰就是:在 mReportButton 的監聽器中,改用 ShareCompat.IntentBuilder 來建立你的 Intent 。
修改CrimeFragment中的mReportButton監聽器的點擊事項。
1 mReportButton.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 ShareCompat.IntentBuilder intentBuilder = ShareCompat.IntentBuilder.from(getActivity()); 5 intentBuilder.setType("text/plain"); 6 intentBuilder.setText(getCrimeReport()); 7 intentBuilder.setSubject(getString(R.string.crime_report_subject)); 8 intentBuilder.createChooserIntent(); 9 intentBuilder.startChooser();10 11 //下面為原本的代碼12 // Intent i = new Intent(Intent.ACTION_SEND);13 // i.setType("text/plain");14 // i.putExtra(Intent.EXTRA_TEXT,getCrimeReport());15 // i.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.crime_report_subject));16 // //建立一個每次都顯示的activity選取器 調用createChooser()方法。17 // startActivity(Intent.createChooser(i, "Select Message app"));18 }19 });
15.6 挑戰練習:又一個隱式 intent相較於發送訊息,憤怒的使用者可能更傾向於直接責問陋習嫌疑人。新增一個按鈕,直接撥打陋習嫌疑人的電話。完成這個挑戰,首先需要連絡人資料庫中的手機號碼。這需要查詢 ContactsContract 資料庫中的 CommonDataKinds.Phone 表。關於查詢方法,建議參閱它們的參考文檔。小提示:你應該使用 android.permission.READ_CONTACTS 許可權。利用這個許可權,可以查詢到 ContactsContract.Contacts._ID 。然後再使用連絡人ID查詢 CommonDataKinds.Phone 表。搞定了電話號碼,就可以使用電話URI建立一個隱式intent:Uri number = Uri.parse("tel:5551234");電話相關的 intent 操作通常有兩種: Intent.ACTION_DIAL 和 Intent.ACTION_CALL 。ACTION_CALL 直接調出手機應用並撥打來自intent的電話號碼;而 ACTION_DIAL 則撥好號碼,然後等待使用者發起通話。我們推薦使用 ACTION_DIAL 操作。這樣的話,使用者就有了冷靜下來改變主意的機會。這種貼心的設計應該會受到歡迎的。
為了嫌疑人電話的持久性儲存。所以首先應在Crime類中增加一個嫌疑人的電話號碼的欄位。
1 private String mNumber;2 3 public String getNumber() {4 return mNumber;5 }6 7 public void setNumber(String number) {8 mNumber = number;9 }
增加欄位後就要修改CrimeBaseHelper的onCreate()方法
1 @Override 2 public void onCreate(SQLiteDatabase db) { 3 db.execSQL("create table " + CrimeTable.NAME + "(" + 4 " _id integer primary key autoincrement, " + 5 CrimeTable.Cols.UUID + ", " + 6 CrimeTable.Cols.TITLE + ", " + 7 CrimeTable.Cols.DATE + ", " + 8 CrimeTable.Cols.SOLVED + "," + 9 CrimeTable.Cols.SUSPECT + ","+10 CrimeTable.Cols.NUMBER + //為資料庫增加一個NUMBER欄位11 ")"12 );13 }
接著修改CrimeCursorWrapper類中的getCrime()方法。
1 public Crime getCrime() { 2 String uuidString = getString(getColumnIndex(CrimeTable.Cols.UUID)); 3 String title = getString(getColumnIndex(CrimeTable.Cols.TITLE)); 4 long date = getLong(getColumnIndex(CrimeTable.Cols.DATE)); 5 int isSolved = getInt(getColumnIndex(CrimeTable.Cols.SOLVED)); 6 String suspect = getString(getColumnIndex(CrimeTable.Cols.SUSPECT)); 7 String number = getString(getColumnIndex(CrimeTable.Cols.NUMBER)); 8 9 Crime crime = new Crime(UUID.fromString(uuidString));10 crime.setTitle(title);11 crime.setDate(new Date(date));12 crime.setSolved(isSolved != 0);13 crime.setSuspect(suspect);14 crime.setNumber(number);15 return crime;16 }
修改CrimeLab類中的getContentValues()方法
1 private static ContentValues getContentValues(Crime crime) { 2 ContentValues values = new ContentValues(); 3 values.put(CrimeTable.Cols.UUID, crime.getId().toString()); 4 values.put(CrimeTable.Cols.TITLE, crime.getTitle()); 5 values.put(CrimeTable.Cols.DATE, crime.getDate().getTime()); 6 values.put(CrimeTable.Cols.SOLVED, crime.isSolved() ? 1 : 0); 7 values.put(CrimeTable.Cols.SUSPECT,crime.getSuspect()); 8 values.put(CrimeTable.Cols.NUMBER, crime.getNumber()); 9 return values;10 }
這裡增加了一句values.put(CrimeTable.Cols.NUMBER, crime.getNumber());
用於之後更新我們的Crime對象。
接著給介面增加一個撥打到電話的按鈕。
修改fragment_crime.xml中的代碼,增加一個Button,代碼如下:
<Button android:id="@+id/call_suspect" android:layout_marginRight="16dp" android:layout_marginLeft="16dp" android:text="Call Suspect" android:layout_width="match_parent" android:layout_height="wrap_content"/>
然後修改CrimeFragment中的代碼去實現這個Button的點擊事件。
在CrimeFragment中增加如下代碼:
public class CrimeFragment extends Fragment {
........ private Button mCallSuspectButton; ........
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ ........ mCallSuspectButton = (Button)v.findViewById(R.id.call_suspect); mCallSuspectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //設定點擊事件 Intent intent = new Intent(Intent.ACTION_DIAL); Uri number = Uri.parse("tel:"+mCrime.getNumber()); intent.setData(number); startActivity(intent); } }); ........ }}
最後在修改onActivityResult()方法。
1 @Override 2 public void onActivityResult(int requestCode, int resultCode, Intent data) { 3 if(resultCode != Activity.RESULT_OK){ 4 return ; 5 } 6 if(requestCode == REQUEST_DATE){ 7 Date date = (Date)data.getSerializableExtra(DatePickerFragment.EXTRA_DATE); 8 mCrime.setDate(date); 9 updateDate(mDateButton, mCrime);10 }else if(requestCode == REQUEST_CONTACT && data != null){11 Uri contactUri = data.getData();12 //這裡增加了一個ContactsContract.Contacts._ID 目的是為了得到目標連絡人ID13 String[] queryFields = new String[]{14 ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts._ID15 };16 Cursor c = getActivity().getContentResolver().query(contactUri,queryFields,null,null,null);17 try{18 if(c.getCount() == 0){19 return;20 }21 c.moveToFirst();22 //取出連絡人姓名23 String suspect = c.getString(0);24 //取出連絡人ID25 String mContactId = c.getString(1);26 //通過ID進行查詢 擷取到Cursor對象。27 Cursor phone = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,28 ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + mContactId, null, null);29 if (phone.moveToNext()) {30 //取出連絡人電話。31 String mPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));32 //給當前的Crime對象設定電話號碼33 mCrime.setNumber(mPhoneNumber);34 }35 mCrime.setSuspect(suspect);36 mSuspectButton.setText(suspect);37 }finally {38 c.close();39 }40 }41 }
這樣當使用者選擇嫌疑人的時候就可以同時將嫌疑人的電話號碼儲存起來。
安卓權威編程-挑戰練習 15章。