android131 360 05

安卓手势触摸滑动:

package com.itheima52.mobilesafe.activity;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

/**
 * 设置引导页的基类, 不需要在清单文件中注册, 因为不需要界面展示,子类要在清单文件写。
 *     <activity android:name=".activity.HomeActivity" />
    <activity android:name=".activity.SettingActivity" />
    <activity android:name=".activity.LostFindActivity" />
    <activity android:name=".activity.Setup1Activity" />
    <activity android:name=".activity.Setup2Activity" />
    <activity android:name=".activity.Setup3Activity" />
    <activity android:name=".activity.Setup4Activity" />
    <activity android:name=".activity.ContactActivity" />

 */
public abstract class BaseSetupActivity extends Activity {
    private GestureDetector mDectector;//安卓自带的手势识别器
    public SharedPreferences mPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPref = getSharedPreferences("config", MODE_PRIVATE);
        // 手势识别器
        mDectector = new GestureDetector(this, new SimpleOnGestureListener() {
            /**
             * 监听手势滑动事件 e1表示滑动的起点,e2表示滑动终点 velocityX表示水平速度 velocityY表示垂直速度
             */
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {
                // 判断纵向滑动幅度是否过大, 过大的话不允许切换界面
                if (Math.abs(e2.getRawY() - e1.getRawY()) > 100) {//getRawY()是基于整个屏幕的位置,屏幕左上角为(0,0)点,getY()基于父控件的坐标位置,父控件的左上角为(0,0)。
                    Toast.makeText(BaseSetupActivity.this, "不能这样划哦!",Toast.LENGTH_SHORT).show();
                    return true;
                }
                // 判断滑动是否过慢
                if (Math.abs(velocityX) < 100) {
                    Toast.makeText(BaseSetupActivity.this, "滑动的太慢了!",Toast.LENGTH_SHORT).show();
                    return true;
                }
                // 向右划,上一页
                if (e2.getRawX() - e1.getRawX() > 200) {
                    showPreviousPage();
                    return true;
                }
                // 向左划, 下一页
                if (e1.getRawX() - e2.getRawX() > 200) {
                    showNextPage();
                    return true;
                }
                return super.onFling(e1, e2, velocityX, velocityY);
            }
        });
    }

    /**
     * 展示下一页, 子类必须实现
     */
    public abstract void showNextPage();

    /**
     * 展示上一页, 子类必须实现
     */
    public abstract void showPreviousPage();

    // 点击下一页按钮
    public void next(View view) {
        showNextPage();
    }

    // 点击上一页按钮
    public void previous(View view) {
        showPreviousPage();
    }

    //滑动事件
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDectector.onTouchEvent(event);// 委托手势识别器处理触摸事件
        return super.onTouchEvent(event);
    }
}

获取sim卡信息:

package com.itheima52.mobilesafe.activity;

import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;

import com.itheima52.mobilesafe.R;
import com.itheima52.mobilesafe.utils.ToastUtils;
import com.itheima52.mobilesafe.view.SettingItemView;

/**
 * 第2个设置向导页
 */
public class Setup2Activity extends BaseSetupActivity {
    private SettingItemView sivSim;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup2);

        sivSim = (SettingItemView) findViewById(R.id.siv_sim);

        String sim = mPref.getString("sim", null);
        if (!TextUtils.isEmpty(sim)) {
            sivSim.setChecked(true);//初始化时是否勾选单选框
        } else {
            sivSim.setChecked(false);
        }
        sivSim.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (sivSim.isChecked()) {
                    sivSim.setChecked(false);
                    mPref.edit().remove("sim").commit();// 删除已绑定的sim卡
                } else {
                    sivSim.setChecked(true);
                    // 保存sim卡信息,sim卡里面也是有内存的,sim卡也有唯一的序列号。
                    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);//sim卡服务
                    String simSerialNumber = tm.getSimSerialNumber();// 获取sim卡序列号,READ_PHONE_STATE权限。
                    System.out.println("sim卡序列号:" + simSerialNumber);
                    mPref.edit().putString("sim", simSerialNumber).commit();// 将sim卡序列号保存在sp中
                }
            }
        });
    }

    @Override
    public void showNextPage() {
        // 如果sim卡没有绑定,就不允许进入下一个页面
        String sim = mPref.getString("sim", null);
        if (TextUtils.isEmpty(sim)) {
            ToastUtils.showToast(this, "必须绑定sim卡!");
            return;
        }
        startActivity(new Intent(this, Setup3Activity.class));
        finish();
        // 两个界面切换的动画
        overridePendingTransition(R.anim.tran_in, R.anim.tran_out);// 进入动画和退出动画
    }

    @Override
    public void showPreviousPage() {
        startActivity(new Intent(this, Setup1Activity.class));
        finish();
        // 两个界面切换的动画
        overridePendingTransition(R.anim.tran_previous_in,R.anim.tran_previous_out);// 进入动画和退出动画
    }
}

监听手机开机启动的广播:

package com.itheima52.mobilesafe.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

/**
 * 监听手机开机启动的广播
 * 清单文件注册广播接受者:
    <receiver android:name=".receiver.BootCompleteReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    权限:
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 */
public class BootCompleteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        SharedPreferences sp = context.getSharedPreferences("config",Context.MODE_PRIVATE);
        boolean protect = sp.getBoolean("protect", false);
        // 只有在防盗保护开启的前提下才进行sim卡判断
        if (protect) {//为true
            String sim = sp.getString("sim", null);// 获取绑定的sim卡
            if (!TextUtils.isEmpty(sim)) {
                // 获取当前手机的sim卡
                TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                String currentSim = tm.getSimSerialNumber() + "111";// 拿到当前手机的sim卡
                if (sim.equals(currentSim)) {
                    System.out.println("手机安全");
                } else {
                    System.out.println("sim卡已经变化, 发送报警短信!!!");
                    String phone = sp.getString("safe_phone", "");// 读取安全号码
                    // 发送短信给安全号码
                    SmsManager smsManager = SmsManager.getDefault();
                    smsManager.sendTextMessage(phone, null,"sim card changed!", null, null);
                }
            }
        }
    }
}

读取手机联系人:

package com.itheima52.contact;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

    private ListView lvList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lvList = (ListView) findViewById(R.id.lv_list);
        ArrayList<HashMap<String, String>> readContact = readContact();
        lvList.setAdapter(new SimpleAdapter(this, readContact,
                R.layout.contact_list_item, new String[] { "name", "phone" },
                new int[] { R.id.tv_name, R.id.tv_phone }));
        //contact_list_item.xml
        /*<?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="10dp" >
            <TextView
                android:id="@+id/tv_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#f00"
                android:textSize="20sp" />
            <TextView
                android:id="@+id/tv_phone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000"
                android:textSize="18sp" />
        </LinearLayout>*/
    }

    private ArrayList<HashMap<String, String>> readContact() {
        // 首先,从raw_contacts表中读取联系人的id("contact_id")
        // 其次, 根据contact_id从data1表中查询出相应的电话号码和联系人名称,电话号码和联系人名称是在2行分别存着,并且是同一个字段。
        // 然后,根据mimetypes表来区分哪个是联系人,哪个是电话号码
        Uri rawContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri dataUri = Uri.parse("content://com.android.contacts/data");

        ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

        // 从raw_contacts中读取联系人的id("contact_id"), getContentResolver()得到的是内容提供者对象。
        //new String[] { "contact_id" }是查询的字段,第一个null是查询条件类似于where条件,第二个null是where条件的参数,第三个null是排序
        Cursor rawContactsCursor = getContentResolver().query(rawContactsUri,new String[] { "contact_id" }, null, null, null);
        if (rawContactsCursor != null) {
            while (rawContactsCursor.moveToNext()) {//遍历
                String contactId = rawContactsCursor.getString(0);
                // System.out.println(contactId);

                // 根据contact_id从data1表中查询出相应的电话号码和联系人名称, 实际上查询的是视图view_data
                Cursor dataCursor = getContentResolver().query(dataUri,
                        new String[] { "data1", "mimetype" }, "contact_id=?",
                        new String[] { contactId }, null);

                if (dataCursor != null) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    while (dataCursor.moveToNext()) {
                        String data1 = dataCursor.getString(0);
                        String mimetype = dataCursor.getString(1);
                        // System.out.println(contactId + ";" + data1 + ";" + mimetype);
                        if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {//电话号码
                            map.put("phone", data1);
                        } else if ("vnd.android.cursor.item/name"
                                .equals(mimetype)) {//联系人
                            map.put("name", data1);
                        }
                    }
                    list.add(map);
                    dataCursor.close();
                }
            }
            rawContactsCursor.close();
        }
        return list;
    }
}

单击选择联系人:

lvList.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                String phone = readContact.get(position).get("phone");// 读取当前item的电话号码
                Intent intent = new Intent();
                intent.putExtra("phone", phone);
                setResult(Activity.RESULT_OK, intent);// 将数据放在intent中返回给上一个页面

                finish();
            }
        });

时间: 2024-10-12 17:16:29

android131 360 05的相关文章

android132 360 05 手机定位

1.网络定位:根据ip地址定位,根据ip地址在实际地址数据库中查询实际地址. 缺点:动态ip导致地址不准确. 2.基站定位:3个基站就可以确定实际位置,定位范围是几百米到几公里不等. 3.GPS定位:美国卫星定位系统(北斗定位是中国的),至少3颗卫星就可以定位,GPS使用24颗卫星基本就可以覆盖全球90%范围,GPS不需要网络只要能够接受卫星信号就可以了,定位的精度比较准确几米到几十米不等.缺点是容易受云层和建筑干扰. 4.安卓采用A-GPS(辅助GPS定位系统),弥补GPS定位缺点,可以通过网

结合JSFL/actionscript 实现轮廓动画

动画前半段通过JSFL获取轮廓数据,并在EnterFrame中逐个边缘画出的:后半段机枪动画是美术做好的flash动画. 这里只放出actionscript代码,而JSFL代码涉及到一个工程,暂时保密. package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.utils.setTimeout; /** * * @author ken

AWR--导出AWR数据

SQL> create or replace directory expdp_dir as '/home/oracle/dump'; Directory created. SQL> @$ORACLE_HOME/rdbms/admin/awrextr ~~~~~~~~~~~~~ AWR EXTRACT ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ This script w

Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45)第4部分 LinkedList遍历方式第5部分 LinkedL

张书乐:360也想造车!红衣教主这是要搞事啊

玩无人驾驶,李彦宏上四环被交警查了-- 在PPT造车太久,结果成了贾跃亭离开乐视的最后一根稻草-- 专注造车好几年,苹果最终因为高层之间无法达成一致,缩水成了代驾(为其它整车厂商开发自动驾驶技术)-- 在互联网厂商几乎每一个大佬都掉进的"造车"坑里,似乎有将迎来一个搅局者--360. 文/张书乐(人民网.人民邮电报专栏作者) 新著有<微博运营完全自学手册> 8月25日15时47分,和汽车八竿子打不着的360安全卫士官方微博丢出来11个字.一张图. 话很简单:9.12   北

Task 9 从用户界面和体验分析“360极速浏览器”

我目前使用的浏览器是360极速浏览器,下面将针对用户界面.记住用户选择.短期刺激.长期使用的好处坏处.不要让用户犯简单的错误四个方面对其进行评估: 1.用户界面: 01 可视性原则--网络没有连接或者访问某个网址没有应答或者不存在时,会分别有不同的提示信息,可以让用户清晰地知道网络问题的症结所在: 02 系统界面符合现实惯例--因为我们平常写作业会经常登录某些特定的网站,比如博客园这些网站.打开网址栏的下拉按钮就可以出现近期访问的网站的网址,然后点击就可以进入,不需要再次进行搜索: 03 用户有

如何使用python来模拟鼠标点击(将通过实例自动化模拟在360浏览器中自动搜索&quot;python&quot;)

一.准备工作: 安装pywin32,后面开发需要pywin32的支持,否则无法完成与windows层面相关的操作. pywin32的具体安装及注意事项: 1.整体开发环境: 基于windows7操作系统; 提前安装python(因为篇幅问题,在此不详细讲解python环境的安装,大家可以自备楼梯): 大家可以在cmd中测试下python环境是否安装好: 大家可以看到我电脑上已经安装好了Python,并显示版本与是V 3.6.2. 注:自己电脑上的Python版本号一定要知道,后面安装pywin3

虚幻UE4中如何采集360度全景图片和VR视频

如何使用虚幻4来制作一个VR视频播放器呢,简单来讲,使用虚幻4的视频采集插件来获取图像,并对图像进行处理,就能获取我们需要的图像了,下一步,你可以把图像投影到一个360度球体上,就能形成球形的播放器了. 1.插件测试-采集单帧双眼图像 打开Epic Games Launcher,启动引擎(我使用的版本为4.14.0).在弹出的对话框中点击New Project标签栏,再选择C++标签页,选择Vehicle Advanced模板,并将项目命名为STEREOSCOPIC.最后点击CreateProj

360笔试-关于手表指针

关于手表指针的算法思考 我们都知道手表上又时分秒三个指针,时针可以决定分针和秒针的位置,分针可以决定秒针的位置.为了简单起见,现在假设只有时针和分针. 现假设某一刻为H:M,(H=0,1,2-11:M=0,1,2..59),那么在该时刻分针的角度(距离起点0点)为:,时针的角度:, 那么时针和分针的夹角: 问题1.时针和分针重合的时刻? 令,化简之后得: 由此可见,每个小时之中都有一个时刻满足时针和分钟重合,注意当H=11的时候,M=60,也就是12点,即0点.所有满足时针分针重合的时刻为: [