安卓權威編程-挑戰練習 15章。
阿新 • • 發佈:2017-07-16
send title 接受 out 原本 有一個 uil ctu ()
15.5 挑戰練習:ShareCompat 第一個練習比較簡單。Android支持庫有個叫作 ShareCompat 的類,它有一個 IntentBuilder. ShareCompat.IntentBuilder 內部類。利用這個內部類創建用於發送消息按鈕的 Intent 略微方 便一些。 因此,你要接受的挑戰就是:在 mReportButton 的監聽器中,改用 ShareCompat. IntentBuilder 來創建你的 Intent 。
修改CrimeFragment中的mReportButton監聽器的點擊事項。
1 mReportButton.setOnClickListener(newView.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; ........
[email protected] 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 目的是為了得到目標聯系人ID 13 String[] queryFields = new String[]{ 14 ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts._ID 15 }; 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 //取出聯系人ID 25 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章。