2015/9/15-5

膜拜大神亮之—-日志级别系统

package com.siso.utils;

import android.util.Log;

/**
 * @author LigthWang
 *
 *         描述:控制全局的log的封装
 */
public class LogUtils {
/** 日志输出级别NONE */

public static final int LEVEL_NONE = 0;

/** 日志输出级别V */

public static final int LEVEL_VERBOSE = 1;

/** 日志输出级别D */

public static final int LEVEL_DEBUG = 2;

/** 日志输出级别I */

public static final int LEVEL_INFO = 3;

/** 日志输出级别W */

public static final int LEVEL_WARN = 4;

/** 日志输出级别E */

public static final int LEVEL_ERROR = 5;

/** 日志输出时的TAG */

private static String mTag = "googleplay";

/** 是否允许输出log */

private static int mDebuggable = LEVEL_ERROR;

/** 用于记时的变量 */

private static long mTimestamp = 0;

/** 以级别为 v 的形式输出LOG */

public static void v(String msg) {

    if (mDebuggable >= LEVEL_VERBOSE) {

        Log.v(mTag, msg);

    }

}

/** 以级别为 d 的形式输出LOG */

public static void d(String msg) {

    if (mDebuggable >= LEVEL_DEBUG) {

        Log.d(mTag, msg);

    }

}

/** 以级别为 i 的形式输出LOG */

public static void i(String msg) {

    if (mDebuggable >= LEVEL_INFO) {

        Log.i(mTag, msg);

    }

}

/** 以级别为 w 的形式输出LOG */

public static void w(String msg) {

    if (mDebuggable >= LEVEL_WARN) {

        Log.w(mTag, msg);

    }

}

/** 以级别为 w 的形式输出Throwable */

public static void w(Throwable tr) {

    if (mDebuggable >= LEVEL_WARN) {

        Log.w(mTag, "", tr);

    }

}

/** 以级别为 w 的形式输出LOG信息和Throwable */

public static void w(String msg, Throwable tr) {

    if (mDebuggable >= LEVEL_WARN && null != msg) {

        Log.w(mTag, msg, tr);

    }

}

/** 以级别为 e 的形式输出LOG */

public static void e(String msg) {

    if (mDebuggable >= LEVEL_ERROR) {

        Log.e(mTag, msg);

    }

}

/** 以级别为 e 的形式输出Throwable */

public static void e(Throwable tr) {

    if (mDebuggable >= LEVEL_ERROR) {

        Log.e(mTag, "", tr);

    }

}

/** 以级别为 e 的形式输出LOG信息和Throwable */

public static void e(String msg, Throwable tr) {

    if (mDebuggable >= LEVEL_ERROR && null != msg) {

        Log.e(mTag, msg, tr);

    }

}

/** 以级别为 e 的形式输出msg信息,附带时间戳,用于输出一个时间段结束点* @param msg 需要输出的msg */

public static void elapsed(String msg) {

    long currentTime = System.currentTimeMillis();

    long elapsedTime = currentTime - mTimestamp;

    mTimestamp = currentTime;

    e("[Elapsed:" + elapsedTime + "]" + msg);

}

}

2015/9/15-4

膜拜大神之—-实现注册完整流程

package com.zsz.develop.registerutils;

import net.tsz.afinal.FinalHttp;
import net.tsz.afinal.http.AjaxCallBack;
import net.tsz.afinal.http.AjaxParams;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

/**
 * @author LigthWang
 *
 *         描述:注册用的封装
 */
public class SmsUitl {

public static final int TYPE_REGISTER = 0;

public static final int TYPE_LOGIN = 1;

/**
 * 初始化获取验证码
 * 
 * @param context
 * @param etPhoneNum
 *            手机号输入框
 * @param btnAcquire
 *            获取验证码按钮
 * @param type
 *            类型
 */
public static void initAcquireCheckNum(final Context context,
        final EditText etPhoneNum, final Button btnAcquire, final int type,
        final String url) {

    // 点击获取验证码
    btnAcquire.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            String strPhoneNum = etPhoneNum.getText().toString().trim();
            if (strPhoneNum.length() == 0) {
                ToastUtil.showToast(context, "请输入手机号码!");
                return;
            }
            if (!(YanZhengUtil.isPhoneNumber(strPhoneNum))) {
                ToastUtil.showToast(context, "请输入有效的手机号!");
                return;
            }

            if (!(new CheckNetwork(context).CheckNetworkAvailable())) {
                return;
            }
            checkPhoneNum(context, strPhoneNum, btnAcquire, type, url);
        }
    });

}

/**
 * 检查当前账号是否被注册
 * 
 * @param context
 * @param phoneNum
 * @param btnAcquire
 * @param type
 */
private static void checkPhoneNum(final Context context,
        final String phoneNum, final Button btnAcquire, final int type,
        final String url) {

    AjaxParams params = new AjaxParams();
    params.put("user.username", phoneNum);

    FinalHttp fh = new FinalHttp();
    fh.post(url, params, new AjaxCallBack<Object>() {

        @Override
        public void onFailure(Throwable t, int errorNo, String strMsg) {
            super.onFailure(t, errorNo, strMsg);

        }

        @Override
        public void onSuccess(Object t) {
            super.onSuccess(t);
            String result = t.toString();
            System.out.println("t ======= " + t.toString());
            if (type == TYPE_LOGIN) {
                if (result.equals("ok")) {

                } else if (result.equals("unregis")) {
                    // 此账户不存在,请注册
                } else if (result.equals("WaitingForCheck")) {
                    // 此手机号已注册,正在审核中,请等待审核
                } else {
                    ToastUtil.showToast(context, "获取验证码失败");
                }
            } else if (type == TYPE_REGISTER) {
                if (result.equals("ok")) {

                } else if (result.equals("unregis")) {
                    startButtonTimer(btnAcquire);
                    acquireCheckNum(phoneNum, type, url);
                } else if (result.equals("WaitingForCheck")) {
                    // 此手机号已注册,正在审核中,请等待审核!
                } else {
                    ToastUtil.showToast(context, "获取验证码失败");
                }
            } else {
                ToastUtil.showToast(context, "获取验证码失败");
            }
        }

    });
}

/**
 * 请求验证码
 * 
 * @param phoneNum
 * @param type
 */
private static void acquireCheckNum(String phoneNum, final int type,
        String url) {
    AjaxParams params = new AjaxParams();
    params.put("user.phone", phoneNum);
    params.put("type", type == TYPE_LOGIN ? "login" : "regeist");
    FinalHttp fh = new FinalHttp();
    fh.post(url, params, null);
}

/**
 * 开始Button计时
 * 
 * @param btnAcquire
 */
private static void startButtonTimer(final Button btnAcquire) {
    btnAcquire.setEnabled(false);
    btnAcquire.setTag(60);
    btnAcquire.setText("已发送短信(60)");
    btnAcquire.post(new ButtonTimerRunable(btnAcquire));
}

// 按钮计时
static class ButtonTimerRunable implements Runnable {

    private Button btn;

    public ButtonTimerRunable(Button btn) {
        this.btn = btn;
    }

    @Override
    public void run() {
        try {
            Integer leftSeconds = (Integer) btn.getTag();
            if (leftSeconds <= 0) {
                btn.setText("重新获取");
                btn.setEnabled(true);
            } else {
                leftSeconds--;
                btn.setText("已发送短信(" + leftSeconds + ")");
                btn.setTag(leftSeconds);
                btn.postDelayed(new ButtonTimerRunable(btn), 1000);
            }
        } catch (Exception e) {
            btn.setText("重新获取");
            btn.setEnabled(true);
        }
    }
}

}

子线程中使用的Toast

膜拜大神亮之——可以在子线程中使用的Toast

package com.zsz.develop.registerutils;

import android.app.Activity;
import android.content.Context;
import android.widget.Toast;

/**
 * @author 作者:LigthWang
 * @date 创建时间:2015年9月9日 下午5:57:27
 * @version 1.0
 * @parameter 内容描述:土司的工具
 * @since
 * @return
 */
public class ToastUtil {

public static Toast mToast;

public static void showToast(Context mContext, String msg) {
    if (mToast == null) {
        mToast = Toast.makeText(mContext, "", Toast.LENGTH_SHORT);
    }
    mToast.setText(msg);
    mToast.show();
}

/**
 * 可以直接在子线程中使用的土司
 * 
 * @param context
 * @param msg
 */
public static void showSuperToast(final Activity context, final String msg) {
    if ("main".equals(Thread.currentThread().getName())) {
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    } else {
        context.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }
}
}

判断网络是否可以用

膜拜大神亮之—- 判断网络是否可以用

package com.zsz.develop.registerutils;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.provider.Settings;

/**
 * @author LigthWang
 *
 *         描述:判断网络的类型的封装
 */
public class CheckNetwork {
private Context context;

public CheckNetwork(Context context) {
    this.context = context;
}

public static boolean IsWifiAvailable(Context context) {
    boolean flag = false;
    ConnectivityManager manager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeInfo = manager.getActiveNetworkInfo();
    if (activeInfo != null && activeInfo.isConnected()) {
        flag = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;
        // mobileConnected = activeInfo.getType() ==
        // ConnectivityManager.TYPE_MOBILE;
    }
    return flag;
}

public static boolean IsNetworkAvailable(Context context) {
    boolean flag = false;
    ConnectivityManager manager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (manager.getActiveNetworkInfo() != null) {
        flag = manager.getActiveNetworkInfo().isAvailable();
    }

    return flag;
}

public boolean CheckNetworkAvailable() {
    boolean flag = false;
    ConnectivityManager manager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (manager.getActiveNetworkInfo() != null) {
        flag = manager.getActiveNetworkInfo().isAvailable();
    }
    if (!flag) {
        // ToastUtil.show(context, "连接不可用,请确认您的网络通畅,稍后再试!");
    }
    return flag;
}

public boolean CheckNetworkAndSet() {
    boolean flag = false;
    ConnectivityManager manager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (manager.getActiveNetworkInfo() != null) {
        flag = manager.getActiveNetworkInfo().isAvailable();
    }
    if (!flag) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setIcon(android.R.drawable.ic_dialog_alert);
        builder.setTitle("网络状态 ");
        builder.setMessage("当前网络不可用,是否设置网络?");
        builder.setPositiveButton("设置",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        context.startActivity(new Intent(
                                Settings.ACTION_SETTINGS)); // ACTION_WIRELESS_SETTINGS
                                                            // 网络设
                    }
                });
        builder.setNegativeButton("离线浏览",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
        builder.create();
        builder.show();
    }

    return flag;

}
}

2015/9/15

2015/9/15日

膜拜大神亮之通过正则表达式来判断是否为指定字符串。

  • 判断电话号码
  • 验证邮箱
  • 验证数字
  • 验证姓名
package com.zsz.develop.lightverify;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.text.TextUtils;

/**
 * @author LigthWang
 *
 * 描述:验证的处理封装
 */
public class YanZhengUtil {

// 验证电话号码
public static boolean isPhoneNumber(String phoneNumber) {
    if (TextUtils.isEmpty(phoneNumber)) {
        return false;
    }

    String expression = "^1[0-9]{10}$";

    Pattern pattern = Pattern.compile(expression);
    Matcher matcher = pattern.matcher(phoneNumber);

    if (matcher.matches()) {
        return true;
    } else {
        return false;
    }
}

// 验证邮箱
public static boolean isEmail(String email) {
    if (TextUtils.isEmpty(email)) {
        return false;
    }

    final String expression = "[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?";

    Pattern pattern = Pattern.compile(expression);
    Matcher matcher = pattern.matcher(email);

    if (matcher.matches()) {
        return true;
    } else {
        return false;
    }
}

// 验证数字
public static boolean isNumeric(String str) {
    if (TextUtils.isEmpty(str)) {
        return false;
    }
    Pattern pattern = Pattern.compile("^[0-9]*$");
    Matcher isNum = pattern.matcher(str);
    if (isNum.matches()) {
        return true;
    } else {
        return false;
    }
}

/**
 * 验证姓名<br/>
 * 中文2-20个字符<br/>
 * 英文2-20个字符<br/>
 * 中英文不能混用
 * 
 * @param name
 *            姓名字符串
 * @return
 */
public static boolean validateName(String name) {

    if (TextUtils.isEmpty(name)) {
        return false;
    }
    // 2-4中文
    Pattern pattern1 = Pattern.compile("^[\u4E00-\u9FA5]{2,20}$");
    Matcher matcher1 = pattern1.matcher(name);

    // 2-12英文
    Pattern pattern2 = Pattern.compile("^[a-zA-Z]{2,20}$");
    Matcher matcher2 = pattern2.matcher(name);

    if (matcher1.matches() || matcher2.matches()) {
        return true;
    } else {
        return false;
    }
}
}

2015/9/14

2015/9/14

为膜拜亮神做铺垫

自定义ListView下拉刷新遇到的问题

关于ListView的 addHeaderView(…) 方法

在代码中使用 listView .addHeaderView(…) 方法可以在ListView组件上方添加上其他组件,并且连结在一起像是一个新组件。如果多次使用 .addHeaderView(…) ,则最先添加的组件在最上方,按添加的先后顺序由上到下罗列。

此时listView 的 position = 0 的位置对应的是view1,而不再是原来listView中的第一条了。

OnGlobalLayoutListener获得一个视图的高度

我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,这是因为View组件布局要在onResume回调后完成。所以现在需要使用getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度。这是获得一个view的宽度和高度的方法之一。

2015/9/14

2015/9/14

膜拜亮大神之—-Toast

不单纯的Toast,先上代码。

package com.zsz.develop.mytoast.mytoast;

import android.app.Activity;
import android.app.AlertDialog;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.zsz.develop.mytoast.R;


/**
 * @author LigthWang
 * 
 *         自定义土司
 */
public class MyToast {

private static final String TOASTBTN_1 = "这是默认的Toast显示";
private static final String TOASTBTN_2 = "这是自定义位置的Toast显示";
private static final String TOASTBTN_3 = "这是带图片的Toast显示";
private static final String TOASTBTN_4 = "这是完全自定义的Toast显示";
private static final String TOASTBTN_5 = "这是长时间的Toast显示";
private static Toast toast = null;

public static void showToast(int witch, Activity context) {
    AlertDialog.Builder builder;
    AlertDialog dialog;
    switch (witch) {
    case 0:
        toast.makeText(context, TOASTBTN_1, Toast.LENGTH_LONG).show();
        break;

    case 1:
        toast = Toast.makeText(context, TOASTBTN_2, Toast.LENGTH_LONG);
        toast.setGravity(Gravity.CENTER, 0, 0);
        toast.show();
        break;
    case 2:
        toast = Toast.makeText(context, TOASTBTN_3, Toast.LENGTH_LONG);
        toast.setGravity(Gravity.CENTER, 50, -100);
        LinearLayout layout = (LinearLayout) toast.getView();
        ImageView image = new ImageView(context);
        image.setImageResource(R.drawable.wallpaper_tree_small);
        layout.addView(image, 0);
        toast.show();
        break;
    case 3:
        LayoutInflater inflater = context.getLayoutInflater();
        View view = inflater.inflate(R.layout.userdefinedtoast,
                (ViewGroup) context.findViewById(R.id.toast_layout));
        TextView txtView_Title = (TextView) view
                .findViewById(R.id.txt_Title);
        TextView txtView_Context = (TextView) view
                .findViewById(R.id.txt_context);
        ImageView imageView = (ImageView) view
                .findViewById(R.id.image_toast);
        toast = new Toast(context);
        toast.setGravity(Gravity.CENTER, 0, 0);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.setView(view);
        toast.show();
        break;
    case 4:
        LayoutInflater inflater1 = context.getLayoutInflater();
        View view1 = inflater1.inflate(R.layout.userdefinedtoast,
                (ViewGroup) context.findViewById(R.id.toast_layout));
        TextView txtView_Title1 = (TextView) view1
                .findViewById(R.id.txt_Title);
        TextView txtView_Context1 = (TextView) view1
                .findViewById(R.id.txt_context);
        ImageView imageView1 = (ImageView) view1
                .findViewById(R.id.image_toast);
        builder = new AlertDialog.Builder(context);
        builder.setView(view1);
        dialog = builder.create();
        dialog.show();
        break;
    }
}

}

需要通过加载xml的时候的Toast,这样就让Toast实现了彻底自定义。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toast_layout"
android:layout_width="200dip"
android:layout_height="fill_parent"
android:background="#111111"
android:orientation="vertical" >

<TextView
    android:id="@+id/txt_Title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center|top"
    android:text="@string/toast_text_1"
    android:textColor="#ffffff"
    android:textSize="20dip" >
</TextView>

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#999999"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/image_toast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dip"
        android:src="@drawable/wallpaper_field_small" >
    </ImageView>

    <TextView
        android:id="@+id/txt_context"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center|right"
        android:text="@string/toast_text_2"
        android:textColor="#ffffff"
        android:textSize="15dip" >
    </TextView>
</LinearLayout>

</LinearLayout>

github代码地址:https://github.com/zszdevelop/WorshipLight

2015/9/10

2015/9/10问题集

Android取得经纬度

从中取得经纬度。
记得要添加权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

-

package com.zsz.develop.gpsfixdemo;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

public class GPSActivity extends AppCompatActivity {
String latLongString;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gps);
    init();
}

private void init() {
    /**
     *取得系统位置管理的引用,
     *getSystem这个一定要在activity里面引用
     */

    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    //添加位置监听。Define a listener that responds to location updates
    LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            // Called when a new location is found by the network location provider.
            //当找到新的位置提供者
            makeUseOfNewLocation(location);
        }

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

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
    // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}

private void makeUseOfNewLocation(Location location) {
    TextView tv1;
    tv1 = (TextView) this.findViewById(R.id.tv1);
    if (location != null) {
        double  latitude = location.getLatitude();
        double longitude= location.getLongitude();
        tv1.setText("维度:" +  latitude+ "\n经度" + longitude);
    } else {
        tv1.setText("无法获取地理信息");
    }
}

如果还要将经纬度转化为城市

package com.zsz.develop.gpsfixdemo;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

public class GPSActivity extends AppCompatActivity {
String latLongString;
double  latitude;
double longitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gps);
    init();
}

private void init() {

    openGPSSettings();
    getLaction();

}
private void openGPSSettings() {
    LocationManager alm = (LocationManager) this
            .getSystemService(Context.LOCATION_SERVICE);
    if (alm
            .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
        Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT)
                .show();
        Log.w("gps ", "正常");
        return;
    }

    Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
    startActivityForResult(intent, 0); //此为设置完成后返回到获取界面

}
private void getLaction(){
    /**
     *取得系统位置管理的引用,
     *getSystem这个一定要在activity里面引用
     */

    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    String serviceName = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) this.getSystemService(serviceName);
    // 查找到服务信息
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗

    String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息

    //添加位置监听。Define a listener that responds to location updates
    LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            // Called when a new location is found by the network location provider.
            //当找到新的位置提供者
            makeUseOfNewLocation(location);
        }

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

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
    // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米
    locationManager.requestLocationUpdates(provider, 1000 * 60, 100, locationListener);

}

private void makeUseOfNewLocation(Location location) {
    TextView tv1;

    tv1 = (TextView) this.findViewById(R.id.tv1);
    if (location != null) {
         latitude = location.getLatitude();
        longitude= location.getLongitude();
        tv1.setText("维度:" +  latitude+ "\n经度" + longitude);
    } else {
        tv1.setText("无法获取地理信息");
    }



    List<Address> addList = null;
    Geocoder ge = new Geocoder(this);
    try {
        addList = ge.getFromLocation(latitude, longitude, 2);
        tv1.append(addList+"");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    if(addList!=null && addList.size()>0){
        for(int i=0; i<addList.size(); i++){
            Address ad = addList.get(i);
            latLongString += "\n";
            latLongString += ad.getCountryName() + ";" + ad.getLocality();
            tv1.append("您当前的位置是:\n" + latLongString);
        }
    }

}



}

Location服务之Geocoder

提到Android基于位置的服务,就不得不提android.location包,

location包提供了很便捷的API来实现基于位置的服务。主要包括Geocoder和LocationManager。今天就先来介绍一下Geocoder。

Geocoder可以在街道地址和经纬度地图坐标之间进行转换。它提供了对两种地理编码功能的访问:

Forward Geocoding(前向地理编码):查找某个地址的经纬度

Reverse Geocoding(反向地理编码):查找一个给定的经纬度所对应的街道地址。

Location获取地理位置信息(中)Criteria类的简单使用

在使用android lcoation的时候,可能不希望自己去硬性的选择是GPS服务还是NETWORK服务,可能是我们考虑的因素有很多,自己很难决定,Android SDK提供了一个类Criteria,直译为标准。

//翻译:返回满足给定的criteria(标准)的最佳provider,(前面一篇文章提到过两种重要provider的区别)。只有当provider权限允许的时候才会返回,如果几个provider均满足criteria设定的标准,最贴近标准的provider将会被返回。如果没有provider满足,标准将按照下面的序列放宽松。

2015/9/9/4

android 定位的几种方式介绍

android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位,

GPS定位

(1) Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智能机应该都有了)。通过GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电;2,绝大部分用户默认不开启GPS模块;3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间;4,室内几乎无法使用。这其中,缺点2,3都是比较致命的。需要指出的是,GPS走的是卫星通信的通道,在没有网络连接的情况下也能用。要实用Adnroid平台的GPS设备,首先需要添加上权限,所以需要添加如下权限:

uses-permission android:name= android.permission.ACCESS_FINE_LOCATION   /uses-permission

简单的实例

要先判断GPS是否已经开启,再去得到他。

package com.zsz.develop.gpsdemo;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

public class GPSActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gps);
    openGPSSettings();
    getLocation();
}


private void openGPSSettings() {
    LocationManager alm = (LocationManager) this
            .getSystemService(Context.LOCATION_SERVICE);
    if (alm
            .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
        Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT)
                .show();
        return;
    }

    Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
    startActivityForResult(intent, 0); //此为设置完成后返回到获取界面

}

private void getLocation() {
    // 获取位置管理服务
    LocationManager locationManager;
    String serviceName = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) this.getSystemService(serviceName);
    // 查找到服务信息
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗

    String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    public void requestPermissions(@NonNull String[] permissions, int requestCode)
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for Activity#requestPermissions for more details.
        return;
    }
    Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置
    updateToNewLocation(location);
    // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米
//        locationManager.requestLocationUpdates(provider, 100 * 1000, 500,
//                locationListener);
}
private void updateToNewLocation(Location location) {

    TextView tv1;
    tv1 = (TextView) this.findViewById(R.id.tv1);
    if (location != null) {
        double  latitude = location.getLatitude();
        double longitude= location.getLongitude();
        tv1.setText("维度:" +  latitude+ "\n经度" + longitude);
    } else {
        tv1.setText("无法获取地理信息");
    }

}
}

(2)Android 基站定位:

Android 基站定位只要明白了基站/WIFI定位的原理,自己实现基站/WIFI定位其实不难。

基站定位一般有几种,

第一种是利用手机附近的三个基站进行三角定位,由于每个基站的位置是固定的,利用电磁波在这三个基站间中转所需要时间来算出手机所在的坐标;

第二种则是利用获取最近的基站的信息,其中包括基站 id,location area code、mobile country code、mobile network code和信号强度,将这些数据发送到google的定位web服务里,就能拿到当前所在的位置信息,误差一般在几十米到几百米之内。其中信号强度这个数据很重要,这里笔者就不多做解释了,

直接给出一个文章,这个文章写的非常好,http://www.cnblogs.com/rayee/archive/2012/02/02/2336101.html

(3)Android Wifi定位 ##:

根据一个固定的WifiMAC地址,通过收集到的该Wifi热点的位置,然后访问网络上的定位服务以获得经纬度坐标。因为它和基站定位其实都需要使用网络,所以在Android也统称为Network方式。

(3.1)而WIFI定位与基站定位的结合,

笔者也在网上找到一个很好的文章,笔者对此就不做任何解释,直接给出网址: http://www.cnblogs.com/coffeegg/archive/2011/10/01/2197129.html

(4)AGPS定位:

AGPS(AssistedGPS:辅助全球卫星定位系统)是结合GSM或GPRS与传统卫星定位,利用基地台代送辅助卫星信息,以缩减GPS芯片获取卫星信号的延迟时间,受遮盖的室内也能借基地台讯号弥补,减轻GPS芯片对卫星的依赖度。和纯GPS、基地台三角定位比较,AGPS能提供范围更广、更省电、速度更快的定位服务,理想误差范围在10公尺以内,日本和美国都已经成熟运用AGPS于LBS服务(Location Based Service,基于位置的服务)。AGPS技术是一种结合了网络基站信息和GPS信息对移动台进行定位的技术,可以在GSM/GPRS、WCDMA和CDMA2000网络中使进行用。该技术需要在手机内增加GPS接收机模块,并改造手机的天线,同时要在移动网络上加建位置服务器、差分GPS基准站等设备。AGPS解决方案的优势主要体现在其定位精度上,在室外等空旷地区,其精度在正常的GPS工作环境下,可以达到10米左右,堪称目前定位精度最高的一种定位技术。该技术的另一优点为:首次捕获GPS信号的时间一般仅需几秒,不像GPS的首次捕获时间可能要2~3分钟

感谢原文作者:http://www.cnblogs.com/cuihongyu3503319/p/3863867.html