ios开发——实用技术篇Swift篇&地址薄、短信、邮件
//返回按钮事件 @IBAction func backButtonClick() { self.navigationController?.popViewControllerAnimated(true) } //新增联系人 @IBAction func addPeople () { //取得电话薄句柄 var error:Unmanaged<CFError>? var addressBook: ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() var newContact:ABRecordRef! = ABPersonCreate().takeRetainedValue() var success:Bool = false //昵称 success = ABRecordSetValue(newContact, kABPersonNicknameProperty, "Gaven", &error) println("设置昵称是否成功: \(success)") //设置姓 success = ABRecordSetValue(newContact, kABPersonFirstNameProperty, "zhang", &error) println("设置姓是否成功: \(success)") //设置名 success = ABRecordSetValue(newContact, kABPersonLastNameProperty, "wu", &error) println("设置名是否成功:\(success)") //添加电话 let tmpMutableMultiPhones:ABMutableMultiValue = ABMultiValueCreateMutable( ABPropertyType(kABStringPropertyType)).takeRetainedValue() success = ABMultiValueAddValueAndLabel(tmpMutableMultiPhones, ", "companyPhone", nil); println("设置电话标题是否成功:\(success)") success = ABRecordSetValue(newContact, kABPersonPhoneProperty, tmpMutableMultiPhones, nil) println("设置电话是否成功:\(success)") //添加邮箱 let addr:ABMutableMultiValue = ABMultiValueCreateMutable( ABPropertyType(kABStringPropertyType)).takeRetainedValue() ABMultiValueAddValueAndLabel(addr, "185@leadingdo.com", "companyEmail", nil) println("设置邮箱标题是否成功:\(success)") ABRecordSetValue(newContact, kABPersonEmailProperty, addr, nil) println("设置邮箱是否成功:\(success)") //保存记录 success = ABAddressBookAddRecord(addressBook, newContact, &error) println("保存记录是否成功:? \(success)") //保存数据库 success = ABAddressBookSave(addressBook, &error) println("修改数据库是否成功: \(success)") } //删除联系人 @IBAction func deletePeople() { //定义错误标记 var error:Unmanaged<CFError>? //取得电话薄句柄 var addressBook: ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() //读取通讯录 let sysAddressBookStatus = ABAddressBookGetAuthorizationStatus() if sysAddressBookStatus == .Denied || sysAddressBookStatus == .NotDetermined { // Need to ask for authorization var authorizedSingal:dispatch_semaphore_t = dispatch_semaphore_create() var askAuthorization:ABAddressBookRequestAccessCompletionHandler = { success, error in if success { ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray dispatch_semaphore_signal(authorizedSingal) } } ABAddressBookRequestAccessWithCompletion(addressBook, askAuthorization) dispatch_semaphore_wait(authorizedSingal, DISPATCH_TIME_FOREVER) } var sysContacts:NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray //遍历通讯录 for contact in sysContacts { var currentContact:Dictionary = [String:String]() // 姓 // var firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as! String? ?? "" println("姓:\(firstName)") // 名 // var lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as! String? ?? "" println("名:\(lastName)") var success:Bool = false if firstName == "zhang" && lastName == "wu" { success = ABAddressBookRemoveRecord(addressBook, contact, nil); println("删除是否成功: \(success)") } //保存数据库 success = ABAddressBookSave(addressBook, &error) println("修改数据库是否成功: \(success)") } } //代码获取地址薄 @IBAction func codeToAddressButtonClick() { //定义错误标记 var error:Unmanaged<CFError>? //取得电话薄句柄 var addressBook: ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() //发出授权信息,界面会弹出提示窗口 let sysAddressBookStatus = ABAddressBookGetAuthorizationStatus() //获取电话薄 if sysAddressBookStatus == .Denied || sysAddressBookStatus == .NotDetermined { // Need to ask for authorization var authorizedSingal:dispatch_semaphore_t = dispatch_semaphore_create() var askAuthorization:ABAddressBookRequestAccessCompletionHandler = { success, error in if success { //获取的联系人信息数组 var sysContacts:NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray //循环读取联系人 for contact in sysContacts { var currentContact:Dictionary = [String:String]() /* 部分单值属性 */ // 姓 // var firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as! String? ?? "" println("姓:\(firstName)") // 名 // var lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as! String? ?? "" println("名:\(lastName)") // 昵称 // var nikename = ABRecordCopyValue(contact, kABPersonNicknameProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var nikename = ABRecordCopyValue(contact, kABPersonNicknameProperty)?.takeRetainedValue() as! String? ?? "" println("昵称:\(nikename)") // 公司(组织) // var organization = ABRecordCopyValue(contact, kABPersonOrganizationProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var organization = ABRecordCopyValue(contact, kABPersonOrganizationProperty)?.takeRetainedValue() as! String? ?? "" println("公司(组织):\(organization)") // 职位 // var jobTitle = ABRecordCopyValue(contact, kABPersonJobTitleProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var jobTitle = ABRecordCopyValue(contact, kABPersonJobTitleProperty)?.takeRetainedValue() as! String? ?? "" println("职位:\(jobTitle)") // 部门 // var department = ABRecordCopyValue(contact, kABPersonDepartmentProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var department = ABRecordCopyValue(contact, kABPersonDepartmentProperty)?.takeRetainedValue() as! String? ?? "" println("部门:\(department)") //备注 // var note = ABRecordCopyValue(contact, kABPersonNoteProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var note = ABRecordCopyValue(contact, kABPersonNoteProperty)?.takeRetainedValue() as! String? ?? "" println("备注:\(note)") /* 部分多值属性 */ // 电话 var propertyValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonPhoneProperty)?.takeRetainedValue() if propertyValues != nil { ..< ABMultiValueGetCount(propertyValues) { var label:String = ABMultiValueCopyLabelAtIndex(propertyValues, i).takeRetainedValue() as String var value = ABMultiValueCopyValueAtIndex(propertyValues, i) var phone = value.takeRetainedValue() as? String ?? "" println("\(label):\(phone)"); } } // E-mail var emailValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonEmailProperty)?.takeRetainedValue() if emailValues != nil { ..< ABMultiValueGetCount(emailValues) { var label:String = ABMultiValueCopyLabelAtIndex(emailValues, i).takeRetainedValue() as String var value = ABMultiValueCopyValueAtIndex(emailValues, i) var email = value.takeRetainedValue() as? String ?? "" println("\(label):\(email)"); } } // 地址 var addressValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonAddressProperty)?.takeRetainedValue() if addressValues != nil { ..< ABMultiValueGetCount(addressValues) { var label:String = ABMultiValueCopyLabelAtIndex(addressValues, i).takeRetainedValue() as String // var value = ABMultiValueCopyValueAtIndex(addressValues, i) // var addrNSDict:NSMutableDictionary = value.takeRetainedValue() as NSMutableDictionary // // var _Country = addrNSDict.valueForKey(kABPersonAddressCountryKey) as? String ?? "" // var _State = addrNSDict.valueForKey(kABPersonAddressStateKey) as? String ?? "" // var _City = addrNSDict.valueForKey(kABPersonAddressCityKey) as? String ?? "" // var _Street = addrNSDict.valueForKey(kABPersonAddressStreetKey) as? String ?? "" // var _Contrycode = addrNSDict.valueForKey(kABPersonAddressCountryCodeKey) as? String ?? "" //2015年5月2号修改 var value = ABMultiValueCopyValueAtIndex(addressValues, i) var addrNSDict:NSMutableDictionary = value.takeRetainedValue() as! NSMutableDictionary var _Country = addrNSDict.valueForKey(kABPersonAddressCountryKey as String) as? String ?? "" var _State = addrNSDict.valueForKey(kABPersonAddressStateKey as String) as? String ?? "" var _City = addrNSDict.valueForKey(kABPersonAddressCityKey as String) as? String ?? "" var _Street = addrNSDict.valueForKey(kABPersonAddressStreetKey as String) as? String ?? "" var _Contrycode = addrNSDict.valueForKey(kABPersonAddressCountryCodeKey as String) as? String ?? "" //或 // var _Country = "" // var _State = "" // var _City = "" // var _Street = "" // var _Contrycode = "" // // if let value:String = addrNSDict.valueForKey(kABPersonAddressCountryKey as String) as? String // { // _Country = value // } // // if let value:String = addrNSDict.valueForKey(kABPersonAddressStateKey as String) as? String // { // _State = value // } // // if let value:String = addrNSDict.valueForKey(kABPersonAddressCityKey as String) as? String // { // _City = value // } // // if let value:String = addrNSDict.valueForKey(kABPersonAddressStreetKey as String) as? String // { // _Street = value // } // // if let value:String = addrNSDict.valueForKey(kABPersonAddressCountryCodeKey as String) as? String // { // _Contrycode = value // } println("\(label)==_Country:\(_Country) _State:\(_State) _City:\(_City) _Street:\(_Street) _Contrycode:\(_Contrycode)"); } } // 纪念日 var dateValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonDateProperty)?.takeRetainedValue() if dateValues != nil { ..< ABMultiValueGetCount(dateValues) { var label:String = ABMultiValueCopyLabelAtIndex(dateValues, i).takeRetainedValue() as String var value = ABMultiValueCopyValueAtIndex(dateValues, i) var date = (value.takeRetainedValue() as? NSDate)?.description println("\(label):\(date)"); } } // URL var urlValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonURLProperty)?.takeRetainedValue() if urlValues != nil { ..< ABMultiValueGetCount(urlValues) { var label:String = ABMultiValueCopyLabelAtIndex(urlValues, i).takeRetainedValue() as String var value = ABMultiValueCopyValueAtIndex(urlValues, i) var url = value.takeRetainedValue() as? String ?? "" println("\(label):\(url)"); } } // SNS var snsValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonSocialProfileProperty)?.takeRetainedValue() if snsValues != nil { ..< ABMultiValueGetCount(snsValues) { var label:String = ABMultiValueCopyLabelAtIndex(snsValues, i).takeRetainedValue() as String var value = ABMultiValueCopyValueAtIndex(snsValues, i) // var snsNSDict:NSMutableDictionary = value.takeRetainedValue() as NSMutableDictionary // var _Username = snsNSDict.valueForKey(kABPersonSocialProfileUsernameKey) as? String ?? "" // var _URL = snsNSDict.valueForKey(kABPersonSocialProfileURLKey) as? String ?? "" // var _Serves = snsNSDict.valueForKey(kABPersonSocialProfileServiceKey) as? String ?? "" //2015年5月2后修改 var snsNSDict:NSMutableDictionary = value.takeRetainedValue() as! NSMutableDictionary var _Username = snsNSDict.valueForKey(kABPersonSocialProfileUsernameKey as String) as? String ?? "" var _URL = snsNSDict.valueForKey(kABPersonSocialProfileURLKey as String) as? String ?? "" var _Serves = snsNSDict.valueForKey(kABPersonSocialProfileServiceKey as String) as? String ?? "" println("\(label)==_Username:\(_Username) _URL:\(_URL) _Serves:\(_Serves)"); } } // IM var imValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonInstantMessageProperty)?.takeRetainedValue() if imValues != nil { ..< ABMultiValueGetCount(imValues) { var label:String = ABMultiValueCopyLabelAtIndex(imValues, i).takeRetainedValue() as String var value = ABMultiValueCopyValueAtIndex(imValues, i) // var imNSDict:NSMutableDictionary = value.takeRetainedValue() as NSMutableDictionary // var _Serves = imNSDict.valueForKey(kABPersonInstantMessageServiceKey) as? String ?? "" // var _Username = imNSDict.valueForKey(kABPersonInstantMessageUsernameKey) as? String ?? "" //2015年5月2后修改 var imNSDict:NSMutableDictionary = value.takeRetainedValue() as! NSMutableDictionary var _Serves = imNSDict.valueForKey(kABPersonInstantMessageServiceKey as String) as? String ?? "" var _Username = imNSDict.valueForKey(kABPersonInstantMessageUsernameKey as String) as? String ?? "" println("\(label)==_Serves:\(_Serves) _Username:\(_Username)"); } } } dispatch_semaphore_signal(authorizedSingal) } } ABAddressBookRequestAccessWithCompletion(addressBook, askAuthorization) dispatch_semaphore_wait(authorizedSingal, DISPATCH_TIME_FOREVER) } } //UI打开地址薄 @IBAction func uiToAddressButtonClick() { var picker = ABPeoplePickerNavigationController() picker.peoplePickerDelegate = self self.presentViewController(picker, animated: true, completion: { () -> Void in }) } // MARK: - ABPeoplePickerNavigationControllerDelegate func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!) { // 姓 // var firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as! String? ?? "" println("选中人的姓:\(firstName)") // 名 // var lastName = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as String? ?? "" //2015年5月2号修改 var lastName = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as! String? ?? "" println("选中人的名:\(lastName)") } func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier) { } func peoplePickerNavigationControllerDidCancel(peoplePicker: ABPeoplePickerNavigationController!) { //取消 peoplePicker.dismissViewControllerAnimated(true, completion: { () -> Void in }) } func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, shouldContinueAfterSelectingPerson person: ABRecord!) -> Bool { return true } func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, shouldContinueAfterSelectingPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier) -> Bool { return true } //发短信 // 添加MessageUI.framework框架 // // 为ViewController类 // 添加UINavigationControllerDelegate, MFMessageComposeViewControllerDelegate 接口 // 实现func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) @IBAction func sendSMSButtonClick() { //判断 if MFMessageComposeViewController.canSendText(){ let controller = MFMessageComposeViewController() // 设置短信内容 controller.body = "短信内容短信内容" // 设置收件人列表 controller.recipients = ["15900001111,18900001111,17011112222"] //设置代理 controller.messageComposeDelegate = self //打开界面 self.presentViewController(controller, animated: true, completion: nil) } else { let alert = UIAlertView(title: "提示信息", message: "本设备不能发短信", delegate: nil, cancelButtonTitle: "确定") alert.show() } } //代理 func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) { controller.dismissViewControllerAnimated(true, completion: nil) switch result.value{ case MessageComposeResultSent.value: println("短信已发送") case MessageComposeResultCancelled.value: println("短信已取消") case MessageComposeResultFailed.value: println("短信发送失败") default: break } } //打电话 @IBAction func phoneButtonClick() { //调用打电话功能--最简单最直接的方式:直接跳到拨号界面 UIApplication.sharedApplication().openURL(NSURL(string: "tel://10086")!) } // 该实例说明了如何使用MessageUI框架组成并在程序内部发送邮件和短信。 // // 该应用使用MessageUI框架的MFMailComposeViewController类和MFMessageComposeViewController类,这两个类分别管理用户界面并充许用户在程序内部集成发送邮件和短信。 // // 该实例显示两个按钮,一个为“发送邮件”,另一个为“发送短信”。 // // 当用户单击“发送邮件”与“发送短信”时,应用分别显示集成的邮件集成界面与短信集成界面。 // // 应用不但检查它们的集成界面是否存在,还检查设备是否已经配置为了可以发送邮件和短信。另处,它提供了反馈消息。 // MFMailComposeViewControllerDelegate //发邮件 @IBAction func sendEmailButtonClick() { if MFMailComposeViewController.canSendMail() { var picker = MFMailComposeViewController() picker.mailComposeDelegate = self //设置主题 picker.setSubject("这是一个主题") //设置发件人 picker.setToRecipients(["1@leadingdo.com","2@leadingdo.com","3@leadingdo.com"]) //设置抄送人 picker.setCcRecipients(["cc1@leadingdo.com","cc2@leadingdo.com"]) //设置密送人 picker.setBccRecipients(["bcc@leadingdo.com"]) //添加图片附件 var path = NSBundle.mainBundle().pathForResource("SwiftClassWeiXin.png", ofType: "") var myData = NSData(contentsOfFile: path!) picker.addAttachmentData(myData, mimeType: "image/png", fileName: "swift.png") //设置邮件正文内容-支持html picker.setMessageBody("这是邮件正文", isHTML: false) //打开界面 self.presentViewController(picker, animated: true, completion: nil) } else { let alert = UIAlertView(title: "提示信息", message: "本设备不能发邮件", delegate: nil, cancelButtonTitle: "确定") alert.show() } } //发送邮件代理方法 func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) { controller.dismissViewControllerAnimated(true, completion: nil) switch result.value{ case MFMailComposeResultCancelled.value: println("邮件已取消") break; case MFMailComposeResultSaved.value: println("邮件已保存") break; case MFMailComposeResultSent.value: println("邮件已发送") break; case MFMailComposeResultFailed.value: println("邮件发送失败") break; default: println("邮件没有发送") break; } } override func viewDidLoad() { super.viewDidLoad() if titleString != nil && titleString != ""{ titleLabel.text = titleString }else{ titleLabel.text = "第12章 地址薄、短信、邮件"; } // Do any additional setup after loading the view. }
ios开发——实用技术篇Swift篇&地址薄、短信、邮件的更多相关文章
- ios开发——实用技术篇Swift篇&播放MP3
播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...
- ios开发——实用技术篇Swift篇&系统声音
系统声音 // MARK: - 系统声音 /*----- 系统声音 ------*/ @IBAction func systemSound() { //建立的SystemSoundID对象 var s ...
- ios开发——实用技术篇Swift篇&拍照
拍照 // MARK: - 拍照 func fromPhotograph() { if UIImagePickerController.isSourceTypeAvailable(.Camera) { ...
- ios开发——实用技术篇Swift篇&照片选择
照片选择 // MARK: - 选择照片 /*----- 选择照片 ------*/ @IBAction func addImageButtonClick() { let actionSheet = ...
- ios开发——实用技术篇Swift篇&视频
视频 // MARK: - 播放视频 /*----- 播放视频 ------*/ func moviePlayerPreloadFinish(notification:NSNotification) ...
- ios开发——实用技术篇Swift篇&录音
录音 // MARK: - 录音 /*----- 录音 ------*/ var recorder:AVAudioRecorder? //录音器 var player:AVAudioPlayer? / ...
- ios开发——实用技术篇Swift篇&加速计和陀螺仪
加速计和陀螺仪 //返回按钮事件 @IBAction func backButtonClick() { self.navigationController?.popViewControllerAnim ...
- ios开发——实用技术篇Swift篇&多点触摸与手势识别
多点触摸与手势识别 //点击事件 var atap = UITapGestureRecognizer(target: self, action: "tapDo:") self.vi ...
- ios开发——实用技术篇OC篇&iOS的主要框架
iOS的主要框架 阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core ...
随机推荐
- [转] AE中如何由IFeature 如何获取所对应的FeatureClass
转载的原文 AE中如何由IFeature 如何获取所对应的FeatureClass 先获取FeatureClass,然后遍历Map中所有的FeatureLayer,然后比较 FeatureClas ...
- bjfu1211 推公式,筛素数
题目是求fun(n)的值 fun(n)= Gcd(3)+Gcd(4)+…+Gcd(i)+…+Gcd(n).Gcd(n)=gcd(C[n][1],C[n][2],……,C[n][n-1])C[n][k] ...
- Mobile testing基础之签名
1. 什么是数字签名? 数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的 2. 为什么要数字签名? 最简单直接的回答: 系统要求的. Android系统 ...
- 《Python基础教程(第二版)》学习笔记 -> 第十一章 文件和素材
打开文件 open函数用来打开文件,语句如下: open(name[,mode[,buffering]]) open函数使用一个文件名作为唯一的强制参数,然后后返回一个文件对象.模式(mode)和缓冲 ...
- C++ 为什么要用覆盖(学习笔记)
长篇大论这里就不说了,举个例子class fruit{public: void func() { printf("fruit\n"); } virtual void vfunc() ...
- LeetCode题解——Unique Path(DP与优化)
题目:A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
- 《Linux命令行与shell脚本编程大全》 第三章 学习笔记
第三章:基本的bash shell命令 bash程序使用命令行参数来修改所启动shell的类型 参数 描述 -c string 从string中读取命令并处理他们 -r 启动限制性shell,限制用户 ...
- CSS定位(CSS定位概述、相对定位、绝对定位、浮动)
CSS 定位属性 CSS 定位属性允许你对元素进行定位. 属性 描述 position 把元素放置到一个静态的.相对的.绝对的.或固定的位置中. top 定义了一个定位元素的上外边距边界与其包含块上边 ...
- <Chapter 2>2-2-2.开发Java应用(Developing a Java App)
App Engine的Java网络应用使用了Java Servlet标准接口来和应用服务器交互.一个应用由一个或多个servlet类组成,每个都扩展了(extend)servlet基类.使用一个叫做部 ...
- Ubuntu 下安装 Oracle Java
这只是一篇流水帐,记录如何安装Java. 在Ubuntu 下管理软件很方便,但安装的Java是opensdk.如果在某些条件下,需要安装Sun (Oracle)的Java,则需要自己手工安装. 一般情 ...