首页 > 代码库 > 安卓权威编程-挑战练习 15章。
安卓权威编程-挑战练习 15章。
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 目的是为了得到目标联系人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章。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。