1. 程式人生 > >鬧鐘功能實現+本地通知+音訊播放

鬧鐘功能實現+本地通知+音訊播放

問題描述:通過picker設定時間,到了設定好的時間鬧鐘響起,並彈出提示框,點選確定,停止播放音訊。如果設定好了鬧鐘,沒有停在該頁面,而是返回了手機主螢幕或是手機鎖屏,當到了鬧鐘設定的時間,會彈出訊息通知。(如果設定的時間是已經過去的時間,頁面不會有響應,直到設定正確的時間為止.

效果圖如下:

          

具體程式碼如下:

NaoZhongViewController.m檔案


#import "NaoZhongViewController.h"

#import <AVFoundation/AVFoundation.h>

#define kW self.view.frame.size.width

#define kH self.view.frame.size.height

@interface NaoZhongViewController ()

{

    NSTimer * _timer;  //定時器

    AVAudioPlayer * _player;

}

@property(nonatomic, weak)UIDatePicker * picker;

@property(nonatomic,weak) UILabel * label;

@property(nonatomic,assign)NSInteger lt;

@property(nonatomic,

weak) UIButton * button;

@end

@implementation NaoZhongViewController 

- (void)viewDidLoad {

    [superviewDidLoad];

    self.title=@"鬧鐘";

self.view.backgroundColor=[UIColorwhiteColor];

    [self_loadView];

}

- (void) _loadView

{

//view

    UIView * view=[[UIView alloc]initWithFrame:CGRectMake

(0, 20+45, kW, kH)];

UIDatePicker * picker=[[UIDatePickeralloc]init];

    picker.backgroundColor=[UIColorcolorWithRed:0.1green:0.1blue:0.5alpha:0.1];

    [view addSubview:picker];

    _picker=picker;

    [self.view addSubview:view];

    UIButton * button=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 50)];

    button.backgroundColor=[UIColorcolorWithRed:0.1green:0.5blue:0.8alpha:0.2];

    button.center=self.view.center;

    [button setTitle:@"確定"forState:UIControlStateNormal];

    [button setTitleColor:[UIColorredColor] forState:UIControlStateNormal];

    [button addTarget:selfaction:@selector(countTime:) forControlEvents:UIControlEventTouchUpInside];

    [button setTitle:@"確定"forState:UIControlStateSelected];

    [button setTitleColor:[UIColorgrayColor] forState:UIControlStateSelected];

    _button=button;

    [self.view addSubview:button];

    UILabel * label=[[UILabel alloc]initWithFrame:CGRectMake(20, 400, kW-40, kH-400-80)];

    label.backgroundColor=[UIColorcolorWithRed:0.2green:0.2blue:0.6alpha:0.2];

    label.text=@"00:00:00";

    label.textAlignment=NSTextAlignmentCenter;

    [label setFont:[UIFontfontWithName:nilsize:80]];

    _label=label;

    [self.view addSubview:label];

    UILabel * label1=[[UILabel alloc]initWithFrame:CGRectMake(25, 400, kW-40, 40)];

    label1.text=@"鬧鐘還剩時間:";

    [self.view addSubview: label1];

}

- (void) countTime:(UIButton *) button

{

    button.selected=!button.selected;

//求從現在到設定時間的時長秒數(有誤差)

/*

    //1970picker的秒數

    NSTimeInterval seconds=[_picker.date timeIntervalSince1970];

    NSLog(@"%@",_picker.date);   //設定的時間

    NSLog(@"%.0f",seconds);

    //1970到現在的秒數

    NSDate * date=[[NSDate alloc]init];

    NSLog(@"%@",date);

    NSTimeInterval seconds2=[date timeIntervalSince1970];

    NSLog(@"%.0f",seconds2);

    NSLog(@"時間差是:----%.0f ",seconds-seconds2);

    */

//求從現在到設定時間的時長秒數(有誤差)

/*

    NSDate * date=[[NSDate alloc]init];

    NSLog(@"%@",date);

    NSTimeInterval seconds2=[_picker.date timeIntervalSinceDate:date];

    NSLog(@"%.0f",seconds2);

    NSLog(@"時間差是:----%.0f ",seconds2);

    */

//picker 設定的時間

    //格式

NSDateFormatter * format1=[[NSDateFormatteralloc]init];

    [format1 setDateFormat:@"hh"];

NSDateFormatter * format2=[[NSDateFormatteralloc]init];

    [format2 setDateFormat:@"mm"];

//獲取小時

    NSString * str1=[format1 stringFromDate:_picker.date];

    NSInteger temp1=[str1 integerValue];

    NSDate * date3=[[NSDate alloc]init];

    NSString * str3=[format1 stringFromDate:date3];

    NSInteger temp3=[str3 integerValue];

//獲取分鐘

    NSString * str2=[format2 stringFromDate:_picker.date];

    NSInteger temp2=[str2 integerValue];

    NSDate * date4=[[NSDate alloc]init];

    NSString * str4=[format2 stringFromDate:date4];

    NSInteger temp4=[str4 integerValue];

    NSLog(@"鬧鐘時長:%li ",(temp1-temp3)*60*60+(temp2-temp4)*60);

//--------------------------------------------------------------------

    NSInteger lt=(temp1-temp3)*60*60+(temp2-temp4)*60;

    _lt=lt;

    if (_lt>0 && _button.selected)

    {

        NSString * strT=[NSString stringWithFormat:@"%02i:%02i:%02i",(int)lt/3600%60,(int)lt/60%60,(int)lt%60];

        _label.text=strT;

    }

    else

    {

NSLog(@"請重新設定時間....");

        _label.text=@"00:00:00";

        return;

    }

    if(_timer==nil)

    {

//每隔0.01秒重新整理一次頁面

_timer=[NSTimerscheduledTimerWithTimeInterval:0.1target:selfselector:@selector(runAction) userInfo:nilrepeats:YES];

        [[NSRunLoopcurrentRunLoop] addTimer:_timerforMode:NSRunLoopCommonModes];

NSLog(@"開始倒計時.....");

    }

    else

    {

        [_timer invalidate];   //定時器失效

    }

}

- (void) runAction

{

    _lt--;

    if (_lt==0)

    {

        [_timer invalidate];//讓定時器失效

UIAlertView * alert=[[UIAlertViewalloc]initWithTitle:@"提示"message:@"關閉鬧鐘"delegate:nilcancelButtonTitle:@"確定"otherButtonTitles:nil];

//        [alert addButtonWithTitle:@"確定"];

        alert.delegate=self;

//        [alert clickedButtonAtIndex:0];

        [alert show];

//提示框彈出的同時,開始響鬧鐘

NSString * path=[[NSBundlemainBundle]pathForResource:@"4948.mp3"ofType:nil];

        NSURL * url=[NSURL fileURLWithPath:path];

        NSError * error;

_player=[[AVAudioPlayeralloc]initWithContentsOfURL:url error:&error];

_player.numberOfLoops=-1;    //無限迴圈  =0 一遍   =1 兩遍    =2 三遍     =負數  單曲迴圈

        _player.volume=2;          //音量

        [_player prepareToPlay];    //準備工作

//[_player stop];       //卡一下

        [_player play];    //開始播放

// 1 註冊通知

UIApplication * app=[UIApplicationsharedApplication];

NSArray * array=[app scheduledLocalNotifications];

        NSLog(@"%ld",array.count);

        for (UILocalNotification * local in array) {

            NSDictionary * dic= local.userInfo;

            if ([dic[@"name"] isEqual:@"zhangsan"]) {

                //刪除指定的通知

                [app cancelLocalNotification:local];

            }

        }

        //刪除所有通知

//    [app cancelAllLocalNotifications];

        //

//判斷是否已經註冊通知

UIUserNotificationSettings* setting= [app currentUserNotificationSettings];

//如果setting.types==UIUserNotificationTypeNone 需要註冊通知

if(setting.types==UIUserNotificationTypeNone){

UIUserNotificationSettings* newSetting= [UIUserNotificationSettingssettingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlertcategories:nil];

            [app registerUserNotificationSettings:newSetting];

        }else{

            [selfaddLocalNotification];

        }

    }

    NSString * str=[NSString stringWithFormat:@"%02d:%02d:%02d",(int)(self.lt)/3600%24,(int)(self.lt)/60%60,(int)(self.lt)%60];

    _label.text=str;

}

#pragma mark - 增加本地通知

- (void) addLocalNotification{

UILocalNotification * notification=[[UILocalNotificationalloc] init];

    notification.fireDate=[NSDatedateWithTimeIntervalSinceNow:0];

    notification.alertBody=@"鬧鐘響了。。。。。。";

    notification.alertAction=@"開啟鬧鐘";

    notification.repeatInterval=NSCalendarUnitSecond;

    notification.applicationIconBadgeNumber=1;

//[email protected]{@"name":@"zhangsan"};

//[email protected]"4195.mp3";

    [[UIApplicationsharedApplication] scheduleLocalNotification:notification];

}

//註冊完成後呼叫

-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{

    [selfaddLocalNotification];

}

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{

NSLog(@"+========我接受到通知了");

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

    [_player stop];

}

@end

PS:上述小程式還有一點小bug(真真是不願再看一遍自己寫的程式碼,頭疼死了),感覺現在做的東西,遇到的問題都被硬處理掉了,完全想不到準確的解決方法~



相關推薦

鬧鐘功能實現+本地通知+音訊播放

問題描述:通過picker設定時間,到了設定好的時間鬧鐘響起,並彈出提示框,點選確定,停止播放音訊。如果設定好了鬧鐘,沒有停在該頁面,而是返回了手機主螢幕或是手機鎖屏,當到了鬧鐘設定的時間,會彈出訊息通知。(如果設定的時間是已經過去的時間,頁面不會有響應,直到設定正確的時間

android實現本地視訊的播放,類似於一個小型的MP4,可以選擇本地的檔案進行播放

首先呢我們來 看一下佈局檔案中的程式碼: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

iOS後臺下載圖片並實現本地通知(Swift)

有的時候我們需要APP進入後臺後能夠自動下載更新一些東西所以這裡就說下iOS程式的後臺下載任務,前面的部落格說過要想進行後臺任務就要在plist檔案中進行註冊,這裡註冊Required background modes選項,值是App downloads con

使用javax.sound實現簡單的音訊播放

/** * @see * @author Al_assad [email protected] * @date 2016年11月17日 下午6:27:59 * @version V1.0 * Description: 簡易音訊播放器(只支援AU,RA,WAV)

FFmpeg3.3.2+SDL2實現流媒體音訊播放

前言: 由於我比較喜歡聽廣播(中國之聲的“千里共良宵”),這個節目也是滿滿的雞湯,不過確實能觸碰到我們夜行俠的內心深處,併產生共鳴,大家也可以去聽聽試試。不過最好用自己製作的播放器,那感覺倍感親切,固現在把我製作的過程拋磚引玉一番。 正文:

Android開發本地及網路Mp3音樂播放器(十五)網路音樂及歌詞下載功能實現

實現功能: 實現網路音樂歌詞下載功能(下載音樂的同時,下載對應歌詞) 下載好的歌詞目前不在播放器內,可以通過檔案瀏覽器檢視。 後續將博文,將實現本地音樂歌詞下載和已下載音樂掃描功能。 因為,沒有自己的伺服器,所以網路音樂所有相關功能(包含搜尋音樂、下載音樂、下載歌詞)均無法

手機影音第七天 視頻的播放下一個視頻功能實現,視頻進度、電量變化的實現

播放器頁面電量變化 視頻進度變化 播放上一個、下一個與序列化實體類 等功能實現 先看下效果圖: 在這裏,視頻進度條會根據視頻播放變化,下方的按鈕中,播放下一個,上一個都已實現。代碼已經托管到碼雲上,想下載看的小夥伴可以從下方地址中獲取 https://git.oschina.net/j

Android中Xposed框架篇-微信實現本地視頻發布到朋友圈功能

快速定位 adb 本地 ref jad jadx mps 頁面 視頻 微信非常龐大,還好有一些強大的工具,下面就來總結收獲的知識。 一、使用adb shell dumpsys activity top命令快速定位頁面 二、使用Jadx進行方法跟蹤時候如果發現沒有結

關於Unity中UGUI圖片Image實現仿視頻播放窗口的四角縮放功能

重置 assert clas () strong unity 操作 寬度 腳本 應用方法:將下面腳本掛載在需要實現四角縮放功能的UI圖片上即可. 自定義拖拽精度(與邊界距離多少內觸發)m_validityWidth. 1 /********************

網易雲歌詞解析(配合audio標簽實現本地歌曲播放,歌詞同步)

極限 telling image 更多 ger 12.1 src say aud 先看下效果 中文歌曲 英文歌曲(如果有翻譯的中文給回返回出去) 韓文歌曲 來看下解析歌詞的類 class Lyric { constructor(data) {

使用Service組件實現簡單的音樂播放功能 --Android基礎

area direct start 獲取 點擊 btn src c函數 extern 1、本例利用Service實現簡單的音樂播放功能,下面是效果圖。(點擊開始播放開啟服務,音樂播放,點擊“停止播放”關閉服務,音樂停止播放。) 2、核心代碼:

js 利用canvas + flv.js實現 視頻流 截屏 、本地下載功能實現,兼容火狐,谷歌, 截屏跨域的坑

font 方案 function can 屬性和方法 load() com DG ren 1 本地視頻截屏(canvsa)    <!DOCTYPE html> <html> <head> <meta charset=

Android系統自帶的MediaRecorder結合Camera實現視訊錄製及播放功能

    近期,公司專案新增了需求,需要視訊錄製,然後儲存到本地,再播放...。 看了很多其他的框架,說不出好壞,應該說各有千秋吧。但我覺得還是原生的靠譜,就是谷歌系統自帶的MediaRecorder。 不多說上程式碼吧(已經測試,沒問題)。 程式碼沒什麼複雜的,都是些

ffmpeg簡易播放器的實現-音訊播放

基於FFmpeg和SDL實現的簡易視訊播放器,主要分為讀取視訊檔案解碼和呼叫SDL顯示兩大部分。詳細流程可參考程式碼註釋。 本篇實驗筆記主要參考如下兩篇文章: [1]. 最簡單的基於FFMPEG+SDL的視訊播放器ver2(採用SDL2.0) [2]. An ffmpeg and SDL Tutorial

Android簡單實現本地圖片和視訊選擇器功能

哈嘍,大家好,好久不見了,很久沒有更新 Android 方面的技術文章了,最近在忙公司的 AR 類的新產品,其中涉及到本地圖片和視訊的選擇和上傳功能。至於為什麼不用系統提供的圖片和視訊選擇器,原因你懂的,系統提供的選擇器只能通過 Intent 方式去獲取,這意味

Unity學習——簡單的順序迴圈播放和截圖儲存功能實現

一:功能簡單介紹 1,在功能實現中,會遇到想順序迴圈使用一個數組的東西,如果到了陣列最後一個後卻不知道怎麼寫程式碼讓其再次從第一個開始 2,各種軟體都會有截圖功能,本篇簡單記錄寫我自己曾遇到的難點,不喜勿噴! 二:簡單的順序迴圈陣列內元素 這裡以順序迴

Android實現本地推送通知的解決方案

                廢話不多說,直接進入正題. 一、自己寫程式碼建立通知,可以參考以下程式碼:   NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);   Stri

AlarmManager+Notification實現定時通知提醒功能

AlarmManager簡介   AlarmManager實質是一個全域性的定時器,是Android中常用的一種系統級別的提示服務,在指定時間或週期性啟動其它元件(包括Activity,Service,BroadcastReceiver)。本文將講解一下如何使

iOS 本地通知實現

iOS本地通知 所有的邏輯都在AppDelegate中, 一個程式更新後用戶長時間沒有使用的提醒 由本地應用觸發的, 它是基於時間行為的一種通知形式, 例如鬧鐘, 提醒事項, 過了一段時間後臺程式提醒使用者使用該應用 iOS 通知機制又叫做訊息機制, 包括(本地通知, 推送

Android中儲存圖片到本地功能實現

文章轉載自http://blog.csdn.net/ccpat/article/details/45314175  感謝原作者~ 本文描述將一個Bitmap物件儲存為一個圖片檔案的主要步驟。儲存的圖片檔案能夠立刻在系統相簿和相簿中找到。 我使用的是一張drawabl