zoukankan      html  css  js  c++  java
  • RK Android5.1 MTK SchedulePowerOnOff

     一.初解定时开关机

    1.1.packages\apps\SchedulePowerOnOff\src\com\mediatek\schpwronoff\AlarmProvider.java

    /* Copyright Statement:
     *
     * This software/firmware and related documentation ("MediaTek Software") are
     * protected under relevant copyright laws. The information contained herein
     * is confidential and proprietary to MediaTek Inc. and/or its licensors.
     * Without the prior written permission of MediaTek inc. and/or its licensors,
     * any reproduction, modification, use or disclosure of MediaTek Software,
     * and information contained herein, in whole or in part, shall be strictly prohibited.
     */
    /* MediaTek Inc. (C) 2010. All rights reserved.
     *
     * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
     * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
     * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
     * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
     * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
     * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
     * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
     * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
     * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
     * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
     * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
     * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
     * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
     * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
     * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
     * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
     * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
     * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
     *
     * The following software/firmware and/or related documentation ("MediaTek Software")
     * have been modified by MediaTek Inc. All revisions are subject to any receiver's
     * applicable license agreements with MediaTek Inc.
     */
    
    package com.mediatek.schpwronoff;
    
    import android.content.ContentProvider;
    import android.content.ContentUris;
    import android.content.ContentValues;
    import android.content.Context;
    import android.content.UriMatcher;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDiskIOException;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.database.sqlite.SQLiteQueryBuilder;
    import android.net.Uri;
    import android.text.TextUtils;
    import android.util.Log;
    
    
    public class AlarmProvider extends ContentProvider {
        private static final String TAG = "AlarmProvider";
        private SQLiteOpenHelper mOpenHelper;
    
        private static final int SCHPWRS = 1;
        private static final int SCHPWRS_ID = 2;
        private static final UriMatcher URLMATCHER = new UriMatcher(UriMatcher.NO_MATCH);
    
        static {
            URLMATCHER.addURI("com.mediatek.schpwronoff", "schpwr", SCHPWRS);
            URLMATCHER.addURI("com.mediatek.schpwronoff", "schpwr/#", SCHPWRS_ID);
        }
    
        private static class DatabaseHelper extends SQLiteOpenHelper {
            private static final String DATABASE_NAME = "schpwrs.db";
            private static final int DATABASE_VERSION = 5;
    
            public DatabaseHelper(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                db.execSQL("CREATE TABLE schpwrs (" + "_id INTEGER PRIMARY KEY," + "hour INTEGER, " + "minutes INTEGER, "
                        + "daysofweek INTEGER, " + "alarmtime INTEGER, " + "enabled INTEGER, " + "vibrate INTEGER, "
                        + "message TEXT, " + "alert TEXT);");
    
                // insert default alarms
                String insertMe = "INSERT INTO schpwrs "
                        + "(hour, minutes, daysofweek, alarmtime, enabled, vibrate, message, alert) " + "VALUES ";
                db.execSQL(insertMe + "(9, 0, 127, 0, 0, 1, '', '');");
                db.execSQL(insertMe + "(23, 00, 127, 0, 0, 1, '', '');");
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
                Log.d("@M_" + TAG, "Upgrading schpwrs database from version " + oldVersion + " to " + currentVersion
                        + ", which will destroy all old data");
                db.execSQL("DROP TABLE IF EXISTS schpwrs");
                onCreate(db);
            }
        }
    
        /**
         * dummy constructor
         */
        public AlarmProvider() {
            super();
        }
    
        @Override
        public boolean onCreate() {
            mOpenHelper = new DatabaseHelper(getContext());
            return true;
        }
    
        @Override
        public Cursor query(Uri url, String[] projectionIn, String selection, String[] selectionArgs, String sort) {
            SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    
            // Generate the body of the query
            int match = URLMATCHER.match(url);
            switch (match) {
            case SCHPWRS:
                qb.setTables("schpwrs");
                break;
            case SCHPWRS_ID:
                qb.setTables("schpwrs");
                qb.appendWhere("_id=");
                qb.appendWhere(url.getPathSegments().get(1));
                break;
            default:
                throw new IllegalArgumentException("Unknown URL " + url);
            }
    
            SQLiteDatabase db = mOpenHelper.getReadableDatabase();
            Cursor ret = qb.query(db, projectionIn, selection, selectionArgs, null, null, sort);
    
            if (ret == null) {
                Log.e("@M_" + TAG, "Alarms.query: failed");
            } else {
                ret.setNotificationUri(getContext().getContentResolver(), url);
            }
    
            return ret;
        }
    
        @Override
        public String getType(Uri url) {
            int match = URLMATCHER.match(url);
            switch (match) {
            case SCHPWRS:
                return "vnd.android.cursor.dir/schpwrs";
            case SCHPWRS_ID:
                return "vnd.android.cursor.item/schpwrs";
            default:
                throw new IllegalArgumentException("Unknown URL");
            }
        }
    
        @Override
        public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
            int count;
            long rowId = 0;
            int match = URLMATCHER.match(url);
            try {
                SQLiteDatabase db = mOpenHelper.getWritableDatabase();
                switch (match) {
                case SCHPWRS_ID:
                    String segment = url.getPathSegments().get(1);
                    rowId = Long.parseLong(segment);
                    count = db.update("schpwrs", values, "_id=" + rowId, null);
                    break;
                default:
                    throw new UnsupportedOperationException("Cannot update URL: " + url);
                }
    
                Log.d("@M_" + TAG, "*** notifyChange() rowId: " + rowId + " url " + url);
                getContext().getContentResolver().notifyChange(url, null);
                return count;
            } catch (SQLiteDiskIOException e) {
                Log.e("@M_" + TAG, e.toString());
                return 0;
            }
        }
    
        @Override
        public Uri insert(Uri url, ContentValues initialValues) {
            Log.d("@M_" + TAG, "---------->>> alarm provider");
            if (URLMATCHER.match(url) != SCHPWRS) {
                throw new IllegalArgumentException("Cannot insert into URL: " + url);
            }
    
            ContentValues values;
            if (initialValues == null) {
                values = new ContentValues();
            } else {
                values = new ContentValues(initialValues);
            }
    
            if (!values.containsKey(Alarm.Columns.HOUR)) {
                values.put(Alarm.Columns.HOUR, 0);
            }
    
            if (!values.containsKey(Alarm.Columns.MINUTES)) {
                values.put(Alarm.Columns.MINUTES, 0);
            }
    
            if (!values.containsKey(Alarm.Columns.DAYS_OF_WEEK)) {
                values.put(Alarm.Columns.DAYS_OF_WEEK, 0);
            }
    
            if (!values.containsKey(Alarm.Columns.ALARM_TIME)) {
                values.put(Alarm.Columns.ALARM_TIME, 0);
            }
    
            if (!values.containsKey(Alarm.Columns.ENABLED)) {
                values.put(Alarm.Columns.ENABLED, 0);
            }
    
            if (!values.containsKey(Alarm.Columns.VIBRATE)) {
                values.put(Alarm.Columns.VIBRATE, 1);
            }
    
            if (!values.containsKey(Alarm.Columns.MESSAGE)) {
                values.put(Alarm.Columns.MESSAGE, "");
            }
    
            if (!values.containsKey(Alarm.Columns.ALERT)) {
                values.put(Alarm.Columns.ALERT, "");
            }
    
            SQLiteDatabase db = mOpenHelper.getWritableDatabase();
            long rowId = db.insert("schpwrs", Alarm.Columns.MESSAGE, values);
            if (rowId < 0) {
                throw new SQLException("Failed to insert row into " + url);
            }
            Log.d("@M_" + TAG, "Added alarm rowId = " + rowId);
    
            Uri newUrl = ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, rowId);
            getContext().getContentResolver().notifyChange(newUrl, null);
            return newUrl;
        }
    
        @Override
        public int delete(Uri url, String where, String[] whereArgs) {
            Log.d("@M_" + TAG, "---->> delete alarm provider");
            SQLiteDatabase db = mOpenHelper.getWritableDatabase();
            int count;
            String whr;
            switch (URLMATCHER.match(url)) {
            case SCHPWRS:
                count = db.delete("schpwrs", where, whereArgs);
                break;
            case SCHPWRS_ID:
                String segment = url.getPathSegments().get(1);
                if (TextUtils.isEmpty(where)) {
                    whr = "_id=" + segment;
                } else {
                    whr = "_id=" + segment + " AND (" + where + ")";
                }
                count = db.delete("schpwrs", whr, whereArgs);
                break;
            default:
                throw new IllegalArgumentException("Cannot delete from URL: " + url);
            }
    
            getContext().getContentResolver().notifyChange(url, null);
            return count;
        }
    }  

     建表 插入默认定时开关机时间  查询、修改、插入、删除

        private static class DatabaseHelper extends SQLiteOpenHelper {
            private static final String DATABASE_NAME = "schpwrs.db";
            private static final int DATABASE_VERSION = 5;
    
            public DatabaseHelper(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                db.execSQL("CREATE TABLE schpwrs (" + "_id INTEGER PRIMARY KEY," + "hour INTEGER, " + "minutes INTEGER, "
                        + "daysofweek INTEGER, " + "alarmtime INTEGER, " + "enabled INTEGER, " + "vibrate INTEGER, "
                        + "message TEXT, " + "alert TEXT);");
    
                // insert default alarms
                String insertMe = "INSERT INTO schpwrs "
                        + "(hour, minutes, daysofweek, alarmtime, enabled, vibrate, message, alert) " + "VALUES ";
                db.execSQL(insertMe + "(9, 0, 127, 0, 0, 1, '', '');");
                db.execSQL(insertMe + "(23, 00, 127, 0, 0, 1, '', '');");
            }
         //在数据库的版本发生变化时会被调用 一般在软件升级时才需改变版本号 而数据库的版本是由程序员控制的 
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
                Log.d("@M_" + TAG, "Upgrading schpwrs database from version " + oldVersion + " to " + currentVersion
                        + ", which will destroy all old data");
                db.execSQL("DROP TABLE IF EXISTS schpwrs");
                onCreate(db);
            }
        }
    

    1.2.packages\apps\SchedulePowerOnOff\src\com\mediatek\schpwronoff\Alarm.java  数据库的工具类

        public static class Columns implements BaseColumns {
            /**
             * The content:// style URL for this table
             */
            public static final Uri CONTENT_URI = Uri.parse("content://com.mediatek.schpwronoff/schpwr");
    

      Alarm 的构造方法  游标来取值

        /**
         * Alarm object constructor
         * @param c Cursor
         */
        public Alarm(Cursor c) {
            mId = c.getInt(Columns.ALARM_ID_INDEX);
            mEnabled = c.getInt(Columns.ALARM_ENABLED_INDEX) == 1;
            mHour = c.getInt(Columns.ALARM_HOUR_INDEX);
            mMinutes = c.getInt(Columns.ALARM_MINUTES_INDEX);
            mDaysOfWeek = new DaysOfWeek(c.getInt(Columns.ALARM_DAYS_OF_WEEK_INDEX));
            mTime = c.getLong(Columns.ALARM_TIME_INDEX);
            mVibrate = c.getInt(Columns.ALARM_VIBRATE_INDEX) == 1;
            mLabel = c.getString(Columns.ALARM_MESSAGE_INDEX);
            String alertString = c.getString(Columns.ALARM_ALERT_INDEX);
            if (Alarms.ALARM_ALERT_SILENT.equals(alertString)) {
                Log.d("@M_" + TAG, "Alarm is marked as silent");
                mSilent = true;
            } else {
                if (alertString != null && alertString.length() != 0) {
                    mAlert = Uri.parse(alertString);
                }
    
                // If the database alert is null or it failed to parse, use the
                // default alert.
                if (mAlert == null) {
                    mAlert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
                }
            }
        }
    

    1.3. packages\apps\SchedulePowerOnOff\src\com\mediatek\schpwronoff\Alarms.java

    设置定时开关机时间

        public static void setAlarm(Context context, int id, boolean enabled, int hour, int minutes,
                Alarm.DaysOfWeek daysOfWeek, boolean vibrate, String message, String alert) {
            final int initSize = 8;
            ContentValues values = new ContentValues(initSize);
            ContentResolver resolver = context.getContentResolver();
            // Set the alarm_time value if this alarm does not repeat. This will be
            // used later to disable expired alarms.
            long time = 0;
            if (!daysOfWeek.isRepeatSet()) {
                time = calculateAlarm(hour, minutes, daysOfWeek).getTimeInMillis();
            }
    
            Log.d("@M_" + TAG, "**  setAlarm * idx " + id + " hour " + hour + " minutes " + minutes
                    + " enabled " + enabled + " time " + time);
    
            values.put(Alarm.Columns.ENABLED, enabled ? 1 : 0);
            values.put(Alarm.Columns.HOUR, hour);
            values.put(Alarm.Columns.MINUTES, minutes);
            values.put(Alarm.Columns.ALARM_TIME, time);
            values.put(Alarm.Columns.DAYS_OF_WEEK, daysOfWeek.getCoded());
            values.put(Alarm.Columns.VIBRATE, vibrate);
            values.put(Alarm.Columns.MESSAGE, message);
            values.put(Alarm.Columns.ALERT, alert);
            resolver.update(ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, id), values, null,
                    null);
    
            if (id == 1) {
                // power on
                setNextAlertPowerOn(context);
            } else if (id == 2) {
                // power off
                setNextAlertPowerOff(context);
            }
        }
    
    
    

    setNextAlertPowerOff -> enableAlert(context, alarm, alarm.mTime);

    am.setExact(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);

        private static void enableAlert(Context context, final Alarm alarm, final long atTimeInMillis) {
            if (alarm == null) {
                return;
            }
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Log.d("@M_" + TAG, "** enableAlertPowerOff id " + alarm.mId + " atTime " + atTimeInMillis);
            Intent intent = new Intent(context, com.mediatek.schpwronoff.SchPwrOffReceiver.class);
            Parcel out = Parcel.obtain();
            alarm.writeToParcel(out, 0);
            out.setDataPosition(0);
            intent.putExtra(ALARM_RAW_DATA, out.marshall());
            PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
            am.setExact(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);
            Calendar c = Calendar.getInstance();
            c.setTime(new java.util.Date(atTimeInMillis));
    
            String poweroffdate=getFormatedDateTime("yy-MM-dd HH:mm:ss",atTimeInMillis);    
             Log.d("@M_" + TAG, "Alarms.enableAlertPowerOff(): setAlert id " + alarm.mId + " poweroffdate "
                    + poweroffdate);            
        }
    
        private static void disableAlert(Context context) {
            Intent intent = new Intent(context, com.mediatek.schpwronoff.SchPwrOffReceiver.class);
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
            am.cancel(sender);
            Log.d("@M_" + TAG, "Alarms.disableAlertPowerOff(): disableForPowerOff");
        }
    

    1.4.packages\apps\SchedulePowerOnOff\src\com\mediatek\schpwronoff\AlarmInitReceiver.java

    调起AlarmReceiverService

    public class AlarmInitReceiver extends BroadcastReceiver {
        private static final String TAG = "AlarmInitReceiver";
    
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.d("@M_" + TAG, "AlarmInitReceiver" + action);
            if (context.getContentResolver() == null) {
                Log.e("@M_" + TAG, "AlarmInitReceiver: FAILURE unable to get content resolver.  Alarms inactive.");
                return;
            }
            AlarmReceiverService.processBroadcastIntent(context, intent);
        }
    }
    

     收到开机广播 开始设置下次定时开关机时间

    	@Override
    	protected void onHandleIntent(Intent intent) {
    
            final String action = intent.getAction();
            if (!ACTION_BROADCAST.equals(action)) {
                return;
            }
    				if(!isFromPowerOn())
    				{
    					return;
    				}
    		final Intent broadcastIntent = intent
    				.getParcelableExtra(Intent.EXTRA_INTENT);
    		final String broadcastAction = broadcastIntent.getAction();
    
    		if (Intent.ACTION_BOOT_COMPLETED.equals(broadcastAction)) {
    			// ALPS00448092.
    			Log.i("@M_" + TAG, "action= " + broadcastAction);
    			boolean b = copyDbFileFromDataPath();
    			Log.w("@M_" + TAG, "copy db file result " + b);
                Alarms.saveSnoozeAlert(this, -1, -1);
    			Alarms.disableExpiredAlarms(this);
    			Alarms.setNextAlert(this);
    		} else {
    			//Alarms.setNextAlert(this);
    		}
    	}
    

      

      

  • 相关阅读:
    Python 队列
    Python 知识要点:input 和 print
    android中ScrollView的setOnClickListener无效
    android.content.res.Resources$NotFoundException: String resource ID #0x1 原因及解决方案
    百度莱茨狗
    机器学习入门——Iris问题
    安卓调用百度地图网页版进行路径规划与导航,只需提供地名
    error:style attribute '@android:attr/windowEnterAnimation' not found 解决方法
    逻辑结构,存储结构,物理结构的区分
    CSDN博客内容中嵌入其他网页
  • 原文地址:https://www.cnblogs.com/crushgirl/p/15682555.html
Copyright © 2011-2022 走看看