简易的拨打电话实现

 简易的拨打电话实现:

首先,打电话是手机底层服务,涉及到用户的隐私信息,在清单文件中添加<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);
                 }
             }
         });
     }
 }