安卓权威编程-挑战练习 15章。

Posted mystic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓权威编程-挑战练习 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章。的主要内容,如果未能解决你的问题,请参考以下文章

安卓权威编程指南 挑战练习 22章 应用图标

安卓权威编程指南 挑战练习 24章 预加载以及缓存

安卓权威编程指南 挑战练习(第26章 在 Lollipop 设备上使用 JobService)

安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用

安卓权威编程 挑战练习13.6

安卓权威编程 5.5 挑战练习