Android开发笔记--在这个不安的世界安心快乐的生活着
1、 <!--获取手机短信-->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
//读取短信授权
if(ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,mPermissions,PERMISSION_REQUEST_CODE);
}else{
SMSUtils.getSms(MainActivity.this);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case PERMISSION_REQUEST_CODE:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
SMSUtils.getSms(MainActivity.this);
}else{
Toast.makeText(MainActivity.this,"读取短信权限被拒绝",Toast.LENGTH_LONG).show();
}
break;
}
}
public class SMSUtils {
// private static Uri SMS_DATA = Uri.parse("content://sms/sent"); //发件箱
private static Uri SMS_DATA = Uri.parse("content://sms/"); //所有短信
// private static Uri SMS_DATA = Uri.parse("content://sms/inbox"); //收件箱
public static void getSms(Context context){
ContentResolver contentResolver = context.getContentResolver();
String[] projection = new String[]{Telephony.Sms._ID,Telephony.Sms.ADDRESS,Telephony.Sms.PERSON,
Telephony.Sms.BODY,Telephony.Sms.DATE,Telephony.Sms.TYPE};
Cursor cursor = contentResolver.query(SMS_DATA,projection,null,null,"date desc");
if(cursor != null){
while (cursor.moveToNext()) {
String phone = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS)); //手机号
String name = cursor.getString(cursor.getColumnIndex(Telephony.Sms.PERSON)); //联系人名字
String content = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY)); //短信内容
String time = cursor.getString(cursor.getColumnIndex(Telephony.Sms.DATE)); //时间
String type = cursor.getString(cursor.getColumnIndex(Telephony.Sms.TYPE)); //短信类型,1为接收,2为发送
Log.i("wanlijun", "phone=" + phone);
Log.i("wanlijun", "name=" + name);
Log.i("wanlijun", "content=" + content);
Log.i("wanlijun", "time=" + time);
Log.i("wanlijun", "type=" + type);
}
}
}
}
2、<!-- 定位 -->
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
/**
* @author wanlijun
* @description 百度地图定位方法封装
* @time 2018/1/12 9:13
*/
public class LocationServiceUtils {
private LocationClient mLocationClient = null;
private MyLocationListener mMyLocationListener;
private Context mContext;
public LocationServiceUtils(Context context){
this.mContext = context;
}
public void getCurrentLocation(){
if(mLocationClient == null){
mLocationClient = new LocationClient(mContext);
}
initLocation();
if(mMyLocationListener == null){
mMyLocationListener = new MyLocationListener();
}
mLocationClient.registerLocationListener(mMyLocationListener);
mLocationClient.start();
}
private void initLocation(){
LocationClientOption options = new LocationClientOption();
options.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可选,设置定位模式,默认高精度 选项:高精度,低功耗,仅设备定位
options.setCoorType("bd09ll"); //可选,设置返回经纬度坐标类型,默认gcj02 选项:gcj02:国测局坐标 bd09ll:百度经纬度坐标 bd09:百度墨卡托坐标 海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标
options.setScanSpan(0); //可选,设置发起定位请求的间隔,int类型,单位ms,如果设置为0,则代表单次定位,即仅定位一次,默认为0,如果设置非0,需设置1000ms以上才有效
options.setOpenGps(true); //可选,设置是否使用gps,默认false ,使用高精度和仅用设备两种定位模式的,参数必须设置为true
options.setLocationNotify(false); //可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
options.setIgnoreKillProcess(true); //可选,定位SDK内部是一个service,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认(建议)不杀死
options.SetIgnoreCacheException(false); //可选,设置是否收集Crash信息,默认收集,即参数为false
options.setWifiCacheTimeOut(5*60*1000); //如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位
options.setEnableSimulateGps(false); //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
options.setIsNeedAddress(true); //可选,是否需要地址信息,默认为不需要,即参数为false
options.setIsNeedLocationDescribe(true); //可选,是否需要位置描述信息,默认为不需要,即参数为false,结果类似于“在北京天安门附近”
options.setIsNeedLocationPoiList(true); //可选,是否需要周边POI信息,默认为不需要,即参数为false
mLocationClient.setLocOption(options);
}
public class MyLocationListener extends BDAbstractLocationListener{
@Override
public void onReceiveLocation(BDLocation bdLocation) {
double latitude = bdLocation.getLatitude(); //获取纬度信息
double longitude = bdLocation.getLongitude();//获取经度信息
String addr = bdLocation.getAddrStr(); //获取详细地址信息
String country = bdLocation.getCountry(); //获取国家
String province = bdLocation.getProvince(); //获取省份
String city = bdLocation.getCity(); //获取城市
String district = bdLocation.getDistrict(); //获取区县
String street = bdLocation.getStreet(); //获取街道信息
String locationDescribe = bdLocation.getLocationDescribe(); //获取位置描述信息
Log.i("wanlijun","latitude="+latitude);
Log.i("wanlijun","longitude="+longitude);
Log.i("wanlijun","addr="+addr);
Log.i("wanlijun","country="+country);
Log.i("wanlijun","province="+province);
Log.i("wanlijun","city="+city);
Log.i("wanlijun","district="+district);
Log.i("wanlijun","street="+street);
Log.i("wanlijun","locationDescribe="+locationDescribe);
List<Poi> poiList = bdLocation.getPoiList(); //获取周边POI信息
for (int i=0;i<poiList.size();i++){
Poi poi = poiList.get(i);
Log.i("wanlijun","poiName="+poi.getName());
}
}
}
}
3、/**
* @author wanlijun
* @description 获取手机上安装的应用信息
* @time 2018/1/12 10:32
*/
public class ApkUtils {
public static final int FILTER_ALL_APP = 1; //所有应用
public static final int FILTER_SYSTEM_APP = 2; //系统应用
public static final int FILTER_THIRD_APP = 3; //第三方应用
public static final int FILTER_SDCARD_APP = 4; //安装在SDcard中的应用
public static ArrayList<String> getApkInfo(Context context, int filter){
ArrayList<String> appNames = new ArrayList<>();
PackageManager pm = context.getPackageManager();
List<PackageInfo> packageInfoList = pm.getInstalledPackages(0);
switch (filter){
case FILTER_ALL_APP:
for(int i=0;i<packageInfoList.size();i++){
PackageInfo packageInfo = packageInfoList.get(i);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
if(TextUtils.isEmpty(appName)){
appName = packageInfo.packageName;
}
appNames.add(appName);
Log.i("wanlijun",appName);
}
break;
case FILTER_SYSTEM_APP:
for(int i=0;i<packageInfoList.size();i++){
PackageInfo packageInfo = packageInfoList.get(i);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
if(TextUtils.isEmpty(appName)){
appName = packageInfo.packageName;
}
if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM )!= 0){
appNames.add(appName);
Log.i("wanlijun",appName);
}
}
break;
case FILTER_THIRD_APP:
for(int i=0;i<packageInfoList.size();i++){
PackageInfo packageInfo = packageInfoList.get(i);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
if(TextUtils.isEmpty(appName)){
appName = packageInfo.packageName;
}
if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM )<= 0){
appNames.add(appName);
Log.i("wanlijun",appName);
}else if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){
//本来是系统程序,被用户手动更新后,该系统程序也成为第三方应用程序了
appNames.add(appName);
Log.i("wanlijun",appName);
}
}
break;
case FILTER_SDCARD_APP:
for(int i=0;i<packageInfoList.size();i++){
PackageInfo packageInfo = packageInfoList.get(i);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
if(TextUtils.isEmpty(appName)){
appName = packageInfo.packageName;
}
if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE )!= 0){
appNames.add(appName);
Log.i("wanlijun",appName);
}
}
break;
}
return appNames;
}
}
1、 <!--获取手机短信-->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
//读取短信授权
if(ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,mPermissions,PERMISSION_REQUEST_CODE);
}else{
SMSUtils.getSms(MainActivity.this);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case PERMISSION_REQUEST_CODE:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
SMSUtils.getSms(MainActivity.this);
}else{
Toast.makeText(MainActivity.this,"读取短信权限被拒绝",Toast.LENGTH_LONG).show();
}
break;
}
}
public class SMSUtils {
// private static Uri SMS_DATA = Uri.parse("content://sms/sent"); //发件箱
private static Uri SMS_DATA = Uri.parse("content://sms/"); //所有短信
// private static Uri SMS_DATA = Uri.parse("content://sms/inbox"); //收件箱
public static void getSms(Context context){
ContentResolver contentResolver = context.getContentResolver();
String[] projection = new String[]{Telephony.Sms._ID,Telephony.Sms.ADDRESS,Telephony.Sms.PERSON,
Telephony.Sms.BODY,Telephony.Sms.DATE,Telephony.Sms.TYPE};
Cursor cursor = contentResolver.query(SMS_DATA,projection,null,null,"date desc");
if(cursor != null){
while (cursor.moveToNext()) {
String phone = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS)); //手机号
String name = cursor.getString(cursor.getColumnIndex(Telephony.Sms.PERSON)); //联系人名字
String content = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY)); //短信内容
String time = cursor.getString(cursor.getColumnIndex(Telephony.Sms.DATE)); //时间
String type = cursor.getString(cursor.getColumnIndex(Telephony.Sms.TYPE)); //短信类型,1为接收,2为发送
Log.i("wanlijun", "phone=" + phone);
Log.i("wanlijun", "name=" + name);
Log.i("wanlijun", "content=" + content);
Log.i("wanlijun", "time=" + time);
Log.i("wanlijun", "type=" + type);
}
}
}
}
2、<!-- 定位 -->
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
/**
* @author wanlijun
* @description 百度地图定位方法封装
* @time 2018/1/12 9:13
*/
public class LocationServiceUtils {
private LocationClient mLocationClient = null;
private MyLocationListener mMyLocationListener;
private Context mContext;
public LocationServiceUtils(Context context){
this.mContext = context;
}
public void getCurrentLocation(){
if(mLocationClient == null){
mLocationClient = new LocationClient(mContext);
}
initLocation();
if(mMyLocationListener == null){
mMyLocationListener = new MyLocationListener();
}
mLocationClient.registerLocationListener(mMyLocationListener);
mLocationClient.start();
}
private void initLocation(){
LocationClientOption options = new LocationClientOption();
options.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可选,设置定位模式,默认高精度 选项:高精度,低功耗,仅设备定位
options.setCoorType("bd09ll"); //可选,设置返回经纬度坐标类型,默认gcj02 选项:gcj02:国测局坐标 bd09ll:百度经纬度坐标 bd09:百度墨卡托坐标 海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标
options.setScanSpan(0); //可选,设置发起定位请求的间隔,int类型,单位ms,如果设置为0,则代表单次定位,即仅定位一次,默认为0,如果设置非0,需设置1000ms以上才有效
options.setOpenGps(true); //可选,设置是否使用gps,默认false ,使用高精度和仅用设备两种定位模式的,参数必须设置为true
options.setLocationNotify(false); //可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
options.setIgnoreKillProcess(true); //可选,定位SDK内部是一个service,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认(建议)不杀死
options.SetIgnoreCacheException(false); //可选,设置是否收集Crash信息,默认收集,即参数为false
options.setWifiCacheTimeOut(5*60*1000); //如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位
options.setEnableSimulateGps(false); //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
options.setIsNeedAddress(true); //可选,是否需要地址信息,默认为不需要,即参数为false
options.setIsNeedLocationDescribe(true); //可选,是否需要位置描述信息,默认为不需要,即参数为false,结果类似于“在北京天安门附近”
options.setIsNeedLocationPoiList(true); //可选,是否需要周边POI信息,默认为不需要,即参数为false
mLocationClient.setLocOption(options);
}
public class MyLocationListener extends BDAbstractLocationListener{
@Override
public void onReceiveLocation(BDLocation bdLocation) {
double latitude = bdLocation.getLatitude(); //获取纬度信息
double longitude = bdLocation.getLongitude();//获取经度信息
String addr = bdLocation.getAddrStr(); //获取详细地址信息
String country = bdLocation.getCountry(); //获取国家
String province = bdLocation.getProvince(); //获取省份
String city = bdLocation.getCity(); //获取城市
String district = bdLocation.getDistrict(); //获取区县
String street = bdLocation.getStreet(); //获取街道信息
String locationDescribe = bdLocation.getLocationDescribe(); //获取位置描述信息
Log.i("wanlijun","latitude="+latitude);
Log.i("wanlijun","longitude="+longitude);
Log.i("wanlijun","addr="+addr);
Log.i("wanlijun","country="+country);
Log.i("wanlijun","province="+province);
Log.i("wanlijun","city="+city);
Log.i("wanlijun","district="+district);
Log.i("wanlijun","street="+street);
Log.i("wanlijun","locationDescribe="+locationDescribe);
List<Poi> poiList = bdLocation.getPoiList(); //获取周边POI信息
for (int i=0;i<poiList.size();i++){
Poi poi = poiList.get(i);
Log.i("wanlijun","poiName="+poi.getName());
}
}
}
}
3、/**
* @author wanlijun
* @description 获取手机上安装的应用信息
* @time 2018/1/12 10:32
*/
public class ApkUtils {
public static final int FILTER_ALL_APP = 1; //所有应用
public static final int FILTER_SYSTEM_APP = 2; //系统应用
public static final int FILTER_THIRD_APP = 3; //第三方应用
public static final int FILTER_SDCARD_APP = 4; //安装在SDcard中的应用
public static ArrayList<String> getApkInfo(Context context, int filter){
ArrayList<String> appNames = new ArrayList<>();
PackageManager pm = context.getPackageManager();
List<PackageInfo> packageInfoList = pm.getInstalledPackages(0);
switch (filter){
case FILTER_ALL_APP:
for(int i=0;i<packageInfoList.size();i++){
PackageInfo packageInfo = packageInfoList.get(i);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
if(TextUtils.isEmpty(appName)){
appName = packageInfo.packageName;
}
appNames.add(appName);
Log.i("wanlijun",appName);
}
break;
case FILTER_SYSTEM_APP:
for(int i=0;i<packageInfoList.size();i++){
PackageInfo packageInfo = packageInfoList.get(i);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
if(TextUtils.isEmpty(appName)){
appName = packageInfo.packageName;
}
if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM )!= 0){
appNames.add(appName);
Log.i("wanlijun",appName);
}
}
break;
case FILTER_THIRD_APP:
for(int i=0;i<packageInfoList.size();i++){
PackageInfo packageInfo = packageInfoList.get(i);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
if(TextUtils.isEmpty(appName)){
appName = packageInfo.packageName;
}
if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM )<= 0){
appNames.add(appName);
Log.i("wanlijun",appName);
}else if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){
//本来是系统程序,被用户手动更新后,该系统程序也成为第三方应用程序了
appNames.add(appName);
Log.i("wanlijun",appName);
}
}
break;
case FILTER_SDCARD_APP:
for(int i=0;i<packageInfoList.size();i++){
PackageInfo packageInfo = packageInfoList.get(i);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
if(TextUtils.isEmpty(appName)){
appName = packageInfo.packageName;
}
if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE )!= 0){
appNames.add(appName);
Log.i("wanlijun",appName);
}
}
break;
}
return appNames;
}
}