用安卓写了一个简单的APP,主要功能是拍照并上传图片。拍照部分功能直接调用系统Camera APIs,上传图片功能部分使用的httpmime。
完成的工程文件可以在这里下载。
Activity and Intent
安卓程序中,有两个重要的东西需要弄清楚,一个是Activity,一个是Intent。
Activity定义了用户和应用交互的逻辑,有点类似与网页前端,是和用户进行交互的界面。不用的是安卓中的Activity有不同的状态,比如当你正在运行一个APP的时候,切换到另外一个APP,那么原先的APP的状态就改变了。Activity的状态变化又叫做Activity Lifecycle,完整的Activity Lifecycle如下图:
用 Activity 类来定义Activity Lifecycle,Activity 有如下的类成员函数。所有的应用都会重写(override) onCreate(Bundle)函数来做一些初始化的工作,大部分会重新onPause()来把必要的数据状态的改变保存下来。需要在不同阶段做的事情,可以通过重载对应的函数就可以啦。
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
在一个安卓应用中,经常会有在Activity中调用另一个Activity的情况,这时就需要使用Intent类来指明需要调用何种Activity、以及传递必要的数据。Intent的意思是目的、意图,个人觉得这个Intent的类名取得非常好,因为它的作用也正是来描述想要做何种操作。以下是Intent的官方解释:
An intent is an abstract description of an operation to be performed. It can be used with startActivity to launch an Activity, broadcastIntent to send it to any interested BroadcastReceiver components, and startService(Intent) or bindService(Intent, ServiceConnection, int) to communicate with a background Service.
An Intent provides a facility for performing late runtime binding between the code in different applications. Its most significant use is in the launching of activities, where it can be thought of as the glue between activities. It is basically a passive data structure holding an abstract description of an action to be performed.
Requesting Permissions at Run Time
首先简单介绍一下,我使用的手机是安卓6.0系统,API 23。从API 23开始,安卓程序中涉及到用户隐私数据的权限需要动态请求权限。通常在程序中需要先检查是否具体有使用权限,没有的话需要请求权限,用户准许了才可以使用。
下面的代码检查应用是否具有读联系人的权限,并在需要的时候请求权限。
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
下面的代码可以用来处理请求权限的结果:
@Override
public void onRequestPe