2016年6月16日星期四

注解使用 (@interface )

一、什么是注释 

    说起注释,得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据。也就是说,元数据是描述数据的。就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义。而J2SE5.0中提供的注释就是java源代码的元数据,也就是说注释是描述java源代码的。在J2SE5.0中可以自定义注释。使用时在@后面跟注释的名字。 

有关注解与自定义注解
参考 
http://blog.csdn.net/junshuaizhang/article/details/8526244
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

注解的 格式是 @interaface, 并且默认的值是 使用 default. 
首先看看 他是怎么定义的

@Retention(RetentionPolicy.RUNTIME)
public @interface userinfo {
String name() default "";
String age() default "";
}

有个 @Retetion注解来定义范围,如果没有这个 那么在使用它时会报错,更多信息参考 上面的网页
之后再看看 在类中使用 注解的 代码

@userinfo(name="kirsong",age="30")
public class UserCl {
@userinfo(name="kirsongmethod",age="30")
public void outpu(){
}
public static void main(String[] args) {
Class<UserCl> c=UserCl.class;
try {
Method method=c.getMethod("outpu", new Class[]{});
boolean flag=UserCl.class.isAnnotationPresent(userinfo.class);
if(flag){
System.out.println("have annotation");  
}
userinfo ui=(userinfo) method.getAnnotation(userinfo.class);
userinfo uime=(userinfo) c.getAnnotation(userinfo.class);
System.out.println(ui.name());
System.out.println(uime.name());

} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
}

你会看到 该类中 分别对类声明以及类方法进行了 注解。
之后在main里 分别读取注解的值,如果你想读取 类声明部分的 值的话 就要使用
class.getAnnotation. 如果是 方法的注解值的话就是 method.getAnnotation

2016年6月1日星期三

android GoogleMap 简单使用

使用这个 需要在 google console里 生成自己的 API Key.网上很多

1. AndroidManifest.xml设置 权限与写入key值
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<meta-data    android:name="com.google.android.geo.API_KEY"    android:value="@string/google_maps_key" />

2.获取 当前的所在坐标与名称
public abstract class GoogleMapLocation {

    Timer timer1;    LocationManager lm;    boolean gps_enabled = false;    boolean network_enabled = false;    String provide = null;    private Context context;    Geocoder mCoder;
    public GoogleMapLocation(Context context){
        this.context=context;
        mCoder=new Geocoder(context, Locale.KOREA);        getLocation();    }

    /**     * 위치를 가져온다     * @return: true가져오기 성공,false;실패     */    public boolean getLocation() {
        //I use LocationResult callback class to pass location value from MyLocation to user code.        if (lm == null)
            lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        //exceptions will be thrown if provider is not permitted.        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);        } catch (Exception ex) {
        }
        try {
            network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);        } catch (Exception ex) {
        }

        //don't start listeners if no provider is enabled        if (!gps_enabled && !network_enabled)
            return false;
        if (gps_enabled) {
            try {
                lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,                        0, 0, locationListenerGps);            } catch (SecurityException e) {
                Log.e("PERMISSION_EXCEPTION", "PERMISSION_NOT_GRANTED");            }
            provide = "gps";        }
        if (network_enabled) {
            try {
                lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,                        0, 0, locationListenerNetwork);            } catch (SecurityException e) {
                Log.e("PERMISSION_EXCEPTION", "PERMISSION_NOT_GRANTED");            }
            provide = "network";        }
        timer1 = new Timer();        timer1.schedule(new GetLastLocation(), 10);        return true;    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();            gotLocation(location);
            try {

                lm.removeUpdates(this);                lm.removeUpdates(locationListenerNetwork);
            } catch (SecurityException e) {
                Log.e("PERMISSION_EXCEPTION", "PERMISSION_NOT_GRANTED");            }
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };
    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();            gotLocation(location);
            try {
                lm.removeUpdates(this);                lm.removeUpdates(locationListenerGps);
            } catch (SecurityException e) {
                Log.e("PERMISSION_EXCEPTION", "PERMISSION_NOT_GRANTED");            }
        }

        public void onProviderDisabled(String provider) {
        }
        public void onProviderEnabled(String provider) {
        }
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };
    class GetLastLocation extends TimerTask {
        @Override        public void run() {
            try {
                lm.removeUpdates(locationListenerGps);                lm.removeUpdates(locationListenerNetwork);
            } catch (SecurityException e) {
                Log.e("PERMISSION_EXCEPTION", "PERMISSION_NOT_GRANTED");            }

            Location net_loc = null, gps_loc = null;
            try {

                if (gps_enabled)
                    gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);                if (network_enabled)
                    net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            } catch (SecurityException e) {
                Log.e("PERMISSION_EXCEPTION", "PERMISSION_NOT_GRANTED");            }


            //if there are both values use the latest one            if (gps_loc != null && net_loc != null) {
                if (gps_loc.getTime() > net_loc.getTime())
                    gotLocation(gps_loc);                else                    gotLocation(net_loc);                return;            }

            Message messag=new Message();            if (gps_loc != null) {
                messag.obj=gps_loc;                handler.sendMessage(messag);                return;            }
            if (net_loc != null) {
                messag.obj=net_loc;                handler.sendMessage(messag);                return;            }
            messag.obj=null;            handler.sendMessage(messag);        }
    }

    private Handler handler=new Handler(){
        @Override        public void handleMessage(Message msg) {
            super.handleMessage(msg);            Location location= (Location) msg.obj;
            gotLocation(location);            locationAddr(location);        }
    };
    /**     * 위치 내보내기     * @param location:위치 값     */    public abstract void gotLocation(Location location);
    /**     * 주소 명칭 반환     * @param addr     */    public abstract void getLocaionAddr(String addr);
    private String locationAddr(Location location){
        String sLocationInfo="";        if (location!=null){
            try {
                List<Address> addresses=mCoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);                if (addresses!=null){
                    Address addr=addresses.get(0);                    for (int i = 0; i <= addr.getMaxAddressLineIndex(); i++) {
                        String addLine = addr.getAddressLine(i);                        sLocationInfo += String.format("%s", addLine);                    }
                    getLocaionAddr(sLocationInfo);                }
            }catch (IOException e){

            }
        }

        return sLocationInfo;    }
}


3.显示到 GoogleMap上并移动到 当前所在位置
>如果实现 OnMapReadyCallback的话,当地图准备完以后就会进入onMapReady
>SupportMapFragment语句中 把googlemap添加到 指定的id上, 也就是 R.id.map
   R.id.map是一个 fragment
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
@Overrideprotected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_maps);    // Obtain the SupportMapFragment and get notified when the map is ready to be used.    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);    mapFragment.getMapAsync(this);
}


@Overridepublic void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    LocationResult locationResult = new LocationResult() {
        @Override        public void gotLocation(Location location) {

            String msg = "lon: "+location.getLongitude()+" -- lat: "+location.getLatitude();            Log.i("map", msg);            drawMarker(location);        }
    };    MyLocation myLocation = new MyLocation();    myLocation.getLocation(getApplicationContext(), locationResult);}


<fragment xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:map="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/map"    android:name="com.google.android.gms.maps.SupportMapFragment"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="mipl.amia.com.googlemapsample.MapsActivity" />