厦门Android培训
达内厦门Android培训中心

0592-5903858

热门课程

新手Android学习心得

  • 时间:2018-05-31 15:46
  • 发布:厦门android
  • 来源:疑难解答

研究android也有一段时间了,单从知识点来说,也撑握了不少东西,却从未在网上发布过任何东西。为了让喜欢android的新手们(其实我也是新 手)少走弯路,从现在起,我会把我总结的(更多是整理的别人的,我只一起展示给大家,也望作者勿怪)知识共享给大家,也希望大家能多提意见,共同进步。 

最基本的开发环境配置、hello world等内容网上很多,我这里不写了,我只把各功能点和注意事项列给大家。 

内容如下: 

1、绘图 
2、短信服务 
3、电话服务 
4、互联网应用 
5、GOOGLE MAP 
6、位置服务 
7、SQLit 
9、多媒体播放 
9、多媒体录制 
10、拍照 
...... 
还有其它更细的知识点介绍。 

(作者:子轩,邮箱:) 
Android学习心得(一)——绘图做java的都知道,绘图肯定首先需要一个 Canvas,然后在用Graphics在上面绘制自己想要图案。不错,Android上面也类似,你可以从一个Bitmap得到它的Canvas,进行 绘制,也可以自定义一个View,用它的Canvas。不同的时,Android里没有Graphics,而用Paint代之,当然用法也稍有不同。以下 是自定义View的一段代码: 

@Override 
public void onDraw(Canvas canvas) { 
// 首先定义一个paint 
Paint paint = new Paint(); 

// 绘制矩形区域-实心矩形 
// 设置颜色 
paint.setColor(Color.WHITE); 
// 设置样式-填充 
paint.setStyle(Style.FILL); 
// 绘制一个矩形 
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint); 

// 绘空心矩形 
// 设置颜色 
paint.setColor(Color.RED); 
// 设置样式-空心矩形 
paint.setStyle(Style.STROKE); 
// 绘制一个矩形 
canvas.drawRect(new Rect(10, 10, 50, 20), paint); 

// 绘文字 
// 设置颜色 
paint.setColor(Color.GREEN); 
// 绘文字 
canvas.drawText(str, 30, 30, paint); 

// 绘图 
// 从资源文件中生成位图 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
// 绘图 
canvas.drawBitmap(bitmap, 10, 10, paint); 


以上需要注意的有三点: 
1、Android中的Rect和java中的可能稍有区别,前两个参数是左上角的坐标,后两个参数是右下角的坐标(不是宽度和高度); 
2、Style.STROKE和Style.FILL外边的像素数是有区别的,这点和java里一样; 
3、绘文字时,设置的坐标点为(30,30),但绘出来后你会发现,文字的左上角坐标要比你设置的偏上,不知道是android设置的bug,还是我们有理解到坐标点的意义。 


Android学习心得(二)——短信服务Android中发短信非常方便,两行代码: 
SmsManager sm = SmsManager.getDefault(); 
sm.sendTextMessage("10086", null, "hello", null, null); 
由于现在我还没有Android手机,也不知道这样能否成功。 

收短信稍稍复杂一点,需要建立一个BroadcastReceiver,来监听android.provider.Telephony.SMS_RECEIVED事件,我不太详述,完整代码如下: 
public class SMSReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
Bundle bundle = intent.getExtras(); 
if (bundle != null) { 
Object[] pdusObj = (Object[]) bundle.get("pdus"); 
if (pdusObj != null) { 
SmsMessage[] messages = new SmsMessage[pdusObj.length]; 
for (int n = 0; n < pdusObj.length; n++) { 
messages[n] = SmsMessage.createFromPdu((byte[]) pdusObj[n]); 
Log.d("MsgTest", "Message: " + n + " " + messages[n].getMessageBody()); 
Log.d("MsgTest", "Message from: " + messages[n].getOriginatingAddress()); 





注意: 
1、不要忘记添加短信收发相关的权限; 
2、不要忘记配置SMSReceiver。 

(作者:子轩,邮箱:) 
Android学习心得(三)——电话服务Android打电话也是两行代码: 
Intent intent = new Intent("android.intent.action.DIAL", Uri.parse("tel:10086") ); 
startActivity(intent); 
这样便进进入呼叫界面了。 

接下来我们再看一下监听电话状态的功能。 

监听电话状态首先建立一个继承于PhoneStateListener电话监听类(如:TeleListener),并让TelephonyManager监听它。 
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
mTelephonyMgr.listen(new TeleListener(), PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTH); 
TeleListener需要实现父类的几个方法,onCallStateChanged、onServiceStateChanged、onSignalStrengthChanged,根据方法名我们便可知其功能,这里就不再详述。 
Android学习心得(四)——互联网应用Android中,互联网应用和java里基本一样,也没有什么好说的,但在我测试上传图片时遇到一个问题,先看一段代码: 
private void uploadImage(String httpUrl) { 
try { 
OutputStream os = null; 
InputStream is = null; 
URL url = new URL(httpUrl); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoOutput(true); 
conn.setDoInput(true); 
conn.setRequestMethod("POST"); 
conn.setRequestProperty("X-Online-Host", "www.ppice.com"); 
conn.connect(); 

os = conn.getOutputStream(); 
InputStream bmis = getResources().openRawResource(R.drawable.icon); 
int i = 0; 
while (i != -1) { 
i = bmis.read(); 
os.write(i); 

bmis.close(); 
os.flush(); 
os.close(); 

is = conn.getInputStream(); 
is.close(); 
} catch (IOException e) { 
e.printStackTrace(); 


这段代码的功能是:向一个Servlet发送一张图片,定义了OutputStream和InputStream,其实这里InputStream本用不 着,但是如果不执行is=conn.getInputStream(),就发不出数据,不知道这是android的bug,还是规定。


Android学习心得(五)——GOOGLE MAPGOOGLE MAP API是Android的靓点之一,我们可以创建一个MapActivity的子类,将MapView显示于其上即可,可以用MapController来控制显示的坐标、地图模式和视野高度,处理起来非常简单。 
完整代码如下: 
public class MapTest extends MapActivity { 
private MapView mapView; 
private MapController mc; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.mapview); 

mapView = (MapView) findViewById(R.id.map); 
mapView.setTraffic(true); 
mc = mapView.getController(); 

GeoPoint gp = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000)); //地理坐标 
mc.animateTo(gp); 
mc.setZoom(12); 


@Override 
protected boolean isRouteDisplayed() { 
return false; 


mapview.xml内容如下: 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 

<com.google.android.maps.MapView android:id="@+id/map" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:enabled="true" 
android:clickable="true" 
android:apiKey="0mHnPl2NS9XPKx6pKwJriV2Wj-mEHSh71yyX_SQ" 
/> 
</RelativeLayout> 

注意: 
1、你要申请一个自己的apiKey; 
2、不要忘了设置互联网访问权限。 

(作者:子轩,邮箱:) 
Android学习心得(六)——位置服务本节主要是介绍一下gps的使用,google map和gps的结合是android上主要应用之一,android market中,此类产品所占比例不小。 
我们在上节的代码中添加如下内容: 
LocationManager lm; 
MyLocationListener locationListener; 
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
locationListener = new MyLocationListener(); 
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
缺少MyLocationListener吧?那我们就创建一个MyLocationListener,要实现LocationListener中的几个方法,LocationListener的功能我就不用再说了吧? 
我吧代码贴出来,一目了然。 
// 下面是从GPS获取坐标的监听,暂时没有使用 
public class MyLocationListener implements LocationListener { 
@Override 
public void onLocationChanged(Location loc) { 
if (loc != null) { 
Log.d("MapTest", "Location changed : Lat: " + loc.getLatitude() + " Lng: " + loc.getLongitude()); 

GeoPoint p = new GeoPoint((int) (loc.getLatitude() * 1E6), (int) (loc.getLongitude() * 1E6)); 
mc.animateTo(p); 
mc.setZoom(16); 
mapView.invalidate(); 



@Override 
public void onProviderDisabled(String provider) { 


@Override 
public void onProviderEnabled(String provider) { 


@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 



注意事项: 
又是权限的问题,我全列出来,随便用哪个了。 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> 

(作者:子轩,邮箱:) 
Android学习心得(七)——SQLite众所周知,移动设备上的数据库最成功的非SQLite莫属了,Android上同样是用SQLite,并且android提供了较为简单的API,用起来非常顺手。 
看下面的代码: 

//定义数据库 
SQLiteDatabase myDB = null; 
//打开或建立数据库(当数据库不存在时,自动分创建) 
myDB = this.openOrCreateDatabase("MY_DATABASE_NAME", "MODE_PRIVATE", null); 

//删除表格、新建表格、插入数据、更新数据,地球人都知道,我也不说了 
myDB.execSQL("........标准的SQL语句..........;"); 

//查询比较麻烦,我这里列出代码 
//查询(表格和数据你自己去建立吧) 
Cursor c = myDB.rawQuery("SELECT id,name,tel FROM MY_DATABASE_TABLE WHERE age>1 order by age;", null); 
if (c != null) { 
if (c.moveToFirst()) { 
do { 
Log.w("test", "id="+c.getString(c.getColumnIndex("id"))); 
Log.w("test", "name="+c.getString(c.getColumnIndex("name"))); 
Log.w("test", "tel="+c.getString(c.getColumnIndex("tel"))); 
Log.w("test", "--------------"); 
} while (c.moveToNext()); 


c.close(); 

//关装闭数据库 
myDB.close(); 

怎么样?比jdbc要简单得多吧?移动设置上功能不需要太强大,好用就好。 

(作者:子轩,邮箱:) 
Android学习心得(八)——多媒体播放先看代码: 
try { 
String path = "/sdcard/t.mp3"; 
MediaPlayer mp = null; 
mp = new MediaPlayer(); 
mp.setDataSource(path); 
mp.prepare(); 
mp.start(); 
mp.setOnCompletionListener(cl); 
} catch (IllegalArgumentException e) { 
e.printStackTrace(); 
} catch (IllegalStateException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 

音频播放,就是这么简单。 
视频播放用VideoView,也不是很复杂。 

我还是把代码加上吧,不然老感觉不完整。 
VideoView videoView = new VideoView(this); 
setContentView(videoView); 
videoView.setVideoURI(Uri.parse("/sdcard/t.3gp")); 
videoView.requestFocus(); 
videoView.start(); 


droid学习心得(九)——多媒体录制还是先看代码,用一种最笨的方式实现了录音的功能: 
try { 
String path = "/sdcard/recorder.amr"; 
MediaRecorder recorder = new MediaRecorder(); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
recorder.setOutputFile(path+name); 
recorder.prepare(); 
recorder.start(); 
try { 
Runnable.wait(10000); 
} catch (Exception exp) { 
exp.printStackTrace(); 

recorder.stop(); 
recorder.release(); 
} catch (IllegalStateException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 

10秒钟哦,等也得等,不等也得等,不用线程怎么行。 

录像就是Audio+Video,所以还要加点东西,看代码: 
path = "/sdcard/v.3gp"; 
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
recorder.setVideoSize(176, 144); 
recorder.setVideoFrameRate(15); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
recorder.setOutputFile(path); 
上一篇:学习Android路上的一些感慨和总结
下一篇:新手学Android的体会!

C语言入门学习-验证性练习

C语言入门学习-增强程序的调试能力

C语言的应用领域及其重要性

C语言的重要性和学习目标

选择城市和中心
贵州省

广西省

海南省