怎么给android日期控件加个属性让系统日期改变

 我来答
zealot37
2014-04-09 · TA获得超过9241个赞
知道大有可为答主
回答量:1704
采纳率:12%
帮助的人:1463万
展开全部
本例控件实现的功能是通过切换时钟状态为设置状态即可通过触屏旋转拨动分针来达到调节时间的目的,点击保存后即可将当前时间更新到系统时间
早先发过一篇帖子说过如何实现拨动指针旋转的特效,在此就不详细叙述了,原帖链接如下:

通过手势实现对时钟的拨动旋转效果(附详细说明)
http://www.eoeandroid.com/forum. ... 1484&fromuid=485185

现在这个DEMO把它封装成自定义控件,对外仅提供了3个公用接口:
public void switchClockState(_ClockState state) // 切换时钟状态

public void saveTimeToSystem() // 保存表盘时间到系统时间

public void reviseTime() // 恢复当前时间为系统时间

复制代码
那么在使用起来就相对方便了
看看主Activity里的代码,是不是很简单:
public class CustomClockDemoActivity extends Activity {

/** Called when the activity is first created. */

private CustomClock mCustomClock1;

private CustomClock mCustomClock2;

private CustomClock mCustomClock3;

private Button mBtnSetting;

private Button mBtnSave;

private Button mBtnNoSave;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

init();

}

public void init()

{

mCustomClock1 = (CustomClock) findViewById(R.id.clock1);

mCustomClock1.switchClockState(CustomClock._ClockState.eQ_CLOCK_RUN);

mCustomClock2 = (CustomClock) findViewById(R.id.clock2);

mCustomClock2.switchClockState(CustomClock._ClockState.eQ_CLOCK_RUN);

mCustomClock3 = (CustomClock) findViewById(R.id.clock3);

mCustomClock3.switchClockState(CustomClock._ClockState.eQ_CLOCK_RUN);

mBtnSetting = (Button) findViewById(R.id.buttonSetting);

mBtnSetting.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Setting();

}

});

mBtnSave = (Button) findViewById(R.id.buttonSave);

mBtnSave.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Save();

}

});

mBtnNoSave = (Button) findViewById(R.id.buttonNoSave);

mBtnNoSave.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

noSave();

}

});

// mCustomClock1.setVisibility(View.INVISIBLE);

mCustomClock2.setVisibility(View.GONE);

mCustomClock3.setVisibility(View.GONE);

}

public void Setting()

{

mCustomClock1.switchClockState(CustomClock._ClockState.eQ_CLOCK_SETTING);

}

public void Save()

{

mCustomClock1.saveTimeToSystem();

mCustomClock1.switchClockState(CustomClock._ClockState.eQ_CLOCK_RUN);

}

public void noSave()

{

mCustomClock1.reviseTime();

mCustomClock1.switchClockState(CustomClock._ClockState.eQ_CLOCK_RUN);

}

}
复制代码
控件自身支持时钟表盘,时针,分针,秒针以及中心圆圈图的配置,如果没有以上配置,则相应使用画笔绘制,那效果自然要大打折扣了,如图,第三个时钟使用的就是纯画笔绘制的:

呵呵,锉吧。刻度没绘制那么细了,反正不是重点,使用纯图片替代的方式才是最佳美观,不过本人美工功底浅薄,PS不出精致的指针,在网上也找不到什么好的素材,只好做3张矩形图填充下颜色来冒充下指针,勿怪哈
关于控件的自定义属性有一下这些:
<?xml version="1.0" encoding="utf-8"?>

<resources>

<declare-styleable name="CustomClock">

<attr name="BackGround_Color" format="integer"/>

<attr name="CenterX" format="integer"/>

<attr name="CenterY" format="integer"/>

<attr name="Circle_Color" format="integer"/>

<attr name="Circle_Pic" format="reference"/>

<attr name="Hour_Pic" format="reference"/>

<attr name="Minute_Pic" format="reference"/>

<attr name="Second_Pic" format="reference"/>

</declare-styleable>

</resources>

复制代码
不用注释差不多都见名知意,CenterX,CenterY即时钟中心点,默认是取视图的中心点,不过有时候时钟背景图未必是中心对称的,所以可能需要设置下这个值
好了,控件的介绍差不多就到这了,具体的细节下代码看吧
下面说个比较严重的问题
原本以为设置系统时间很简单,没错,代码很简单,但是却无效
后面上网查了下,由于修改系统时间需要系统权限,需要在配置文件的manifest节点加入这句话android:sharedUserId="android.uid.system
问题就来了,无法安装APK!原因是所安装设备没有开ROOT权限
既然这样的话,理论上开了ROOT权限的设备应该是可以安装的咯
可是找来一台开了ROOT的真机来试还是不行,不知道是哪里出问题了
(如果哪位仁兄能够直接成功部署源码工程到设备上的麻烦跟偶说声哈,以打消藕的疑虑)
既然不行,只好另辟新径
广泛流传的是以下两种方案:
  第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:

  1. 在应用程序的AndroidManifest.xml中的manifest节点中加入
  android:sharedUserId="android.uid.system"这个属性。
  2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
  3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

  第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:

  1. 同上,加入android:sharedUserId="android.uid.system"这个属性。
  2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。
  3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。
  4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,

  首先找到密钥文件,在我的Android源码目录中的位置
  是"build argetproductsecurity",下面的platform.pk8和platform.x509.pem
  两个文件。

  然后用Android提供的Signapk工具来签名,signapk的源代码是
  在"build oolssignapk"下,
  用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk",
  文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。
  这样最后得到的apk和第一个方法是一样的。

其实不难看出,两种方法都直接与你所要安装的设备上的系统密钥相关了,那么各个手机厂商都不可能使用原始ANDROID系统,而密钥各不相同,我们又无法获取,所以对于没有刷ROOT的设备恐怕是安装不了本程序了。不过ANDORID虚拟机用的就是原始系统,要安装上去应该是没问题的。我采用第二种方法,测试成功,下面说说具体点的步骤

这里我上传的包里有以下文件:

解压里面的SING.rar包到指定目录,里面已经包含了那两个系统文件还有待签名的APK,在签名的时候必须将apk事先用rar 文件打开,进入META-INF目录下,将CERT.SF和CERT.RSA这两个文件删除掉,我放在SIGN.RAR里面的APK已经删除了CERT.SF和CERT.RSA这两个文件
接着DOS窗口定位到该目录,在命令行下输入如下命令:java -jar signapk.jar platform.x509.pem platform.pk8 CustomClockDemo.apk CustomClock.apk ,这样生成的CustomClock.apk就可以安装到虚拟机了,

源码工程是CustomClock.zip
CustomClock.apk是已签过名的APK,理论上可以直接安装到虚拟机上运行
大家可以先试这把它安装到虚拟机,如果提示已安装,就先把软件卸载了(同包名软件),如果提示无法完成安装的话,我看后面的事情就别折腾了,应该也是安装不了的,看大家人品了 人品实在不行的童鞋就把工程里android:sharedUserId="android.uid.system这行删了,不过这样虽能正常安装,设置时间可是无效的哦~看看旋转效果吧
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式