简易的拨打电话实现
简易的拨打电话实现:
首先,打电话是手机底层服务,涉及到用户的隐私信息,在清单文件中添加<uses-permission android:name="android.permission.CALL_PHONE" />;
第二,自定义Intent。
1、带入CALL,通过Uri.parse()带入用户的手机号码,最终以startActivity()启动。
Intent intent = new Intent("android.intent.action.CALL", Uri .parse("tel:" + inNumber));
startActivity(intent);
2、也可以通过调用虚拟键盘,通过Uri.parse()带入用户的手机号码,最终以startActivity()启动。
Intent intent = new Intent("android.intent.action.DIAL", Uri.parse("tel:" + inNumber));
startActivity(intent);
总结:前者的启动方式,是直接就会拨打输入的这个号码,即跳至到拨打了电话的界面;而后者,只是调用虚拟的拨打电话的键盘,即电话号码输入的键盘,此时并没有拨通这个号码,而只是将这个输入的号码显示在此界面上,你可以选择不拨打,也就换号码等。
至于,下面两种方式,只是跳转至拨号界面,而且在Intent构造中不可带入号码(向上面一样的方式),否则出现错误。
Intent intent = new Intent("android.intent.action.CALL_BUTTON");
Intent intent = new Intent(Intent.ACTION_CALL_BUTTON);
在输入框中添加属性: android:phoneNumber="true" ,避免自己要对输入的数据进行判断。
Java代码:(对于layout文件很简单,就一个EditText,Button)
public class MainActivity extends Activity {
private EditText et = null;
private Button tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);
tv = (Button) findViewById(R.id.tv);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String inNumber = et.getText().toString();
Intent intent = new Intent("android.intent.action.CALL", Uri
.parse("tel:" + inNumber));
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
发送短信
必须在清单文件中假如:<uses-permission android:name="android.permission.SEND_SMS" />
发送短信有三种方式,下面采用sendTextMessage()方法:
发送短信的关键程序是通过SmsManager对象的sendTextMessage()方法来实现,其中sendTextMessage()方法需要传入五个值依次是:
收件人地址(string)
发送地址(String)
正文(String)
发送服务(PendingIntent)
送达服务(PendingIntent)
其中收件人与正文不可以为null的两个参数。
Java代码:
public class MainActivity extends Activity {
private EditText et = null;
private EditText et1 = null;
private Button tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);
et1 = (EditText) findViewById(R.id.et1);
tv = (Button) findViewById(R.id.tv);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String inNumber = et.getText().toString();
String inMessage = et1.getText().toString();
SmsManager smsManager = SmsManager.getDefault();
/*
* 条件通过,发送短信
* 先构建PendingIntent对象并使用getBroadcast()广播,将PendingIntent
* ,电话,短信文字参数传入 sendTextMessage()方法中,发送短信
*/
PendingIntent pi = PendingIntent.getBroadcast(
MainActivity.this, 0, new Intent(), 0);
smsManager.sendTextMessage(inNumber, null, inMessage, pi, null);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Vibrate震动
首先,加入<uses-permission android:name="android.permission.VIBRATE" />,在调用方法vibrate(new long[] { 100, 10, 1000, 5000 }, -1)时,需要传入一个long类型的数组,前面三个是震动的大小,可以设置为一大一小,最后一个但表震动的事件长短,还有一个repeat参数,-1表示只震动一次,0表示持续震动。取消震动调用方法cancel()。
Toast显示更多的控件以及动态加载布局文件
在Toast中放入其他的控件,可以通过View赋值给Toast
LinearLayout linearLayout = new LinearLayout(MainActivity.this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
Toast toast = Toast.makeText(MainActivity.this, "HI",
Toast.LENGTH_SHORT);
ImageView im = new ImageView(MainActivity.this);
im.setImageResource(R.drawable.ic_launcher);
TextView tv = new TextView(MainActivity.this);
tv.setText("Welcome to!");
linearLayout.addView(im);
linearLayout.addView(tv);
toast.setView(linearLayout);
toast.show();================================================================
动态一:
LinearLayout views = (LinearLayout) getLayoutInflater()
.inflate(R.layout.dd, null); Toast toast = Toast.makeText(MainActivity.this, "HI",Toast.LENGTH_SHORT);
toast.setView(views);
toast.show();
动态二:
View views = LayoutInflater.from(MainActivity.this).inflate(
R.layout.dd, null);
Toast toast = Toast.makeText(MainActivity.this, "HI",Toast.LENGTH_SHORT);
toast.setView(views);
toast.show();
动态三:
LayoutInflater inflater = (LayoutInflater) MainActivity.this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View views = inflater.inflate(R.layout.dd, null);
Toast toast = Toast.makeText(MainActivity.this, "HI",Toast.LENGTH_SHORT);
toast.setView(views);//还可以设置与手机的相对位置
toast.show();
上面三种方式其实,就是获取LayoutInflater对象的三种不同方式而已,都是通过LayoutInflater对象来调用inflate方法。
手机状态栏中的图标和文字NotificationManager与Notification
状态栏手机最上方有一条显示电池状态、时间、信号强度等等,这是手机里面的状态栏(Status Bar)。当有电话打入、或者有新的短信时状态栏中会有提示。
Java代码:
MainActivity.java
public class MainActivity extends Activity {
private Spinner sp3;
private ArrayAdapter<String> mAdapter;
private String[] mStatuses = { "OnLine", "Leave", "Busy", "Hide" };
private NotificationManager mNotificationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
initView();
sp3.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
if (mStatuses[position].equals("OnLine")) {
setNotiType(R.drawable.ic_launcher, "Online");
} else if (mStatuses[position].equals("Leave")) {
setNotiType(R.drawable.ic_launcher, "Leave");
} else if (mStatuses[position].equals("Hide")) {
setNotiType(R.drawable.ic_launcher, "Hide");
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
@SuppressWarnings("deprecation")
protected void setNotiType(int icLauncher, String string) {
// 创建新的Intent
Intent notifyIntent = new Intent(this, NotifyActivity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 创建PendingIntent作为设置运行的Activity
PendingIntent appIntent = PendingIntent.getActivity(MainActivity.this,
0, notifyIntent, 0);
// 创建Notication,并设置相关参数
Notification mNotification = new Notification();
// 设置statusbar显示的icon
mNotification.icon = icLauncher;
// 设置statusbar显示的信息
mNotification.tickerText = string;
// 设置同时发出的声音
mNotification.defaults = Notification.DEFAULT_SOUND;
// 设置Notification留言条的参数
mNotification.setLatestEventInfo(MainActivity.this, "QQ", string,
appIntent);
// 送出Notification
mNotificationManager.notify(0, mNotification);
}
private void initView() {
sp3 = (Spinner) findViewById(R.id.bt3);
mAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, mStatuses);
// 应用Spinner定义的下拉模式
mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp3.setAdapter(mAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
NotifyActivity.java (点击提示消息进入的界面)
public class NotifyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(NotifyActivity.this, "This is a test.",
Toast.LENGTH_SHORT).show();
finish();//结束掉
}
}
mNotification.defaults = Notification.DEFAULT_SOUND;//系统默认的声音
mNotification.defaults = Notification.DEFAULT_LIGHTS;//手机屏幕发亮
mNotification.defaults = Notification.DEFAULT_VIBRATE;//手机震动
mNotification.defaults = Notification.DEFAULT_ALL;//三者都有
恢复手机默认桌面
添加<uses-permission android:name="android.permission.SET_WALLPAPER"/>,重写ContextWrapper中的clearWallpaper()方法。
如下代码:
public class MainActivity extends Activity {
private Button returnBack = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
returnBack = (Button) findViewById(R.id.returnback);
returnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
clearWallpaper();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
// 重写ContextWrapper中的clearWallpaper()方法
@Override
public void clearWallpaper() throws IOException {
// TODO Auto-generated method stub
super.clearWallpaper();
}
}
更换桌面可以采用方法:setWallpaper(InputStream data)。
获取桌面的方法:getWallpaper()或者peekWallpaper(),两者都是返回Drawable,前者返回有效的资源,当手机没有设定桌面时,前者返回手机默认的桌面,而后者返回null,常用在替换手机桌面程序使用,也可以将获取的Drawable对象转成Bitmap。
TextView的正则表达式
一、android:autoLink中设置相应的属性值
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/et"
android:autoLink="web|email|phone"/>
二、Linkify 判断输入是何种形式,并于系统链接
tv.setText(et.getText());//在这条语句后紧紧接着下句Linkfy
// 判断输入是何种形式,并于系统链接
Linkify.addLinks(tv, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS | Linkify.EMAIL_ADDRESSES);
// 直接设置为all,支持所支持的。
------------------还可以用在TextView的子类中,比如Button,设置
<Button
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/et"
android:autoLink="web|email|phone"
android:text="457869232" />
点击后到达拨号界面。
Context
Context提供的有关文件的方法:
getDir(String name, int mode);
getFileStreamPath(String name)
getFilesDir();
openFileInput(String name);
openFileOutput(String name, mode)
以上五个方法获取文件的路径都是在/data/data/package name/files,eg:/data/data/com.example.back/files。
WIFI的操作打开
WifiManager状态常数及意义
WifiManager状态常数 | 意 义 |
WifiManager.WIFI_STATE_ENABLED | WiFi已打开 |
WifiManager.WIFI_STATE_ENABLING | WiFi打开中 |
WifiManager.WIFI_STATE_DISABLING | WiFi关闭中 |
WifiManager.WIFI_STATE_DISABLED | WiFi已关闭 |
WifiManager.WIFI_STATE_UNKNOWN | 未知的WiFi状态 |
由于WiFiManager的打开(setWifiEnabled(true))或关闭(setWifiEnabled(false))方法,在运行的打开WiFi过程中,会经过以下顺序:
1.WifiManager.WIFI_STATE_DISABLED
2.WifiManager.WIFI_STATE_ENABLING
3.WifiManager.WIFI_STATE_ENABLED
而在关闭WiFi的过程中,则需经过以下顺序:
1.WifiManager.WIFI_STATE_ENABLED
2.WifiManager.WIFI_STATE_DISABLING
3.WifiManager.WIFI_STATE_DISABLED
打开或者关闭wifi是需要一段时间的,如果在状态处于WIFI_STATE_ENABLING时,运行一次"打开"功能,将导致错误,因此,程序必须对这类的事件状态进行捕捉,否则,就不知道WiFi究竟何时可以打开完毕,而手机与WiFi AP的连接也有访问的时间,并非是马上单击就能立即反应其打开结果。
在AndroidManifest.xml中必须添加WiFi以及访问网络状态的权限,但并非一定要有Android.permission.INTERNET以及Android.permission.WAKE_LOCK这两个权限。会放上这两个权限,是因为大部分的WiFi连接创建之后,都会去检查WiFi是否具有因特网的连接能力;因为连接检查需要一些时间,所以,通常程序中会加上WAKE_LOCK权限,控制不要让背景灯光暗下来,故编写以下的权限提供参考。
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
查看一部手机之前连过的或者感应到的所有WIFI热点列表,见代码。
package com.example.wifi;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class MainActivity extends Activity {
private Button mButton01;
private ListView mListView01;
private ArrayAdapter<String> aryAdapter1;
private ArrayList<String> arylistTask;
private WifiManager mWiFiManager01;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton01 = (Button) findViewById(R.id.myButton1);
mListView01 = (ListView) findViewById(R.id.myListView1);
/* 以getSystemService取得WIFI_SERVICE */
mWiFiManager01 = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
mWiFiManager01.startScan();
mButton01.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
arylistTask = new ArrayList<String>();
/* 设置WifiConfiguration对象 */
List<WifiConfiguration> wificonf = mWiFiManager01
.getConfiguredNetworks();
/* 若发现至少1个WiFi无线基地台 */
if (wificonf.size() > 0) {
/* 尝试打开WiFi服务 */
if (!mWiFiManager01.isWifiEnabled()) {
if (mWiFiManager01.getWifiState() != WifiManager.WIFI_STATE_ENABLING) {
mWiFiManager01.setWifiEnabled(true);
}
}
/* 尝试连接第一个无线网络基地台 */
int intNetworkID = wificonf.get(0).networkId;
/* 通过enableNetwork连接至该无线网络设置 */
mWiFiManager01.enableNetwork(intNetworkID, true);
int i = 1;
/* 通过循环将无线网络的SSID以及NetWorkID放入Adapter */
for (WifiConfiguration amTask : wificonf) {
arylistTask.add("" + (i++) + ": " + amTask.SSID
+ "(ID=" + amTask.networkId + ")");
}
aryAdapter1 = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1, arylistTask);
/* 程序以ListView的方式将结果呈现出来 */
mListView01.setAdapter(aryAdapter1);
}
}
});
}
}