设置WordPress的RSS格式输出

这个WP博客的RSS之前一直不是格式输出,在Google Reader里的阅读体验非常不好。注意到这个问题后,决定着手解决它。

首先找到了hackerzhou的这篇文章,不过不知为何按照其步骤修改后依然无效。或许是主题的关系。

随后又找到了这篇文章,由于使用的是同一个主题,我想应该可以成功。方法很简单:

  1. 打开wp-includes 目录下的 feed-rss2.php 文件。
  2. 将两处    <description><![CDATA[<?php the_excerpt_rss() ?>]]></description>    都替换为   <description><![CDATA[<?php the_content() ?>]]></description>

完成!

之后是一些测试。

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题

段落

缩进。粗体。斜体。下划线。

列举:

  • 其一
  • 其二
  • 其三

图片测试

经测试,成功输出带格式全文RSS。

索尼爱立信发表Xperia ray等三款新机型

在昨天新加坡举行的CommunicAsia展会上,索尼爱立信正式发表了Xperia ray、Xperia Active和txt三款新机型。

首先是曝光已久的Xperia ray。这款搭载了Android 2.3的Xperia智能手机拥有一块3.3英寸的FWVGA分辨率液晶屏。9.4mm厚度的铝制机身是其特色。和Xperia arc等相同,ray具有720P高清视频拍摄,可以在微光环境下获得较好拍摄效果的Exmor R for Mobile传感器以及提升屏幕显示效果Mobile Bravia Engine。其实与arc相比唯一缺失的只有HDMI输出功能。这应该也是机身厚度的限制。不过电池仍然保证了1500mAh的容量,确保了续航时间。Xperia ray将有金、黑、粉、白四种颜色。

以下是Xperia的一些图片,来自索尼爱立信:

除了Xperia ray,索尼爱立信同时发表了一款Xperia三防手机。Xperia Active。

搭载了Android 2.3系统,3英寸的HVGA分辨率屏幕的Xperia Active,将三防做到了极致。防尘、防水的它即使用湿手指也可以操作。1GHz的处理器,500万像素的的摄像头,Mobile Bravia Engine和1200mAh的电池保证了其作为智能手机的性能。Xperia Active将有橙黑和白黑两色,于今年第三季度上市。

以下同样是一些产品图片:

此外还有一款专注于文字输入的全键盘手机,txt。tex具有2.6英寸的QVGA屏幕和310万像素的摄像头,各种配置也中规中距。适合对文字输入速度较为敏感的用户。

Android编程中Debug certificate expired错误的解决方法

今天晚上突然eclipse中所有的项目都报错,项目文件夹上标记了叉号。提示“Your project contains error(s),please fix them begore running your application”。可是可以肯定的是它们的代码并没有问题。

一查看,发现问题信息是Error generating final archive: Debug certificate expired on 2011/06/22 19:10! 无语……

既然现有的签名过期了,那就重新生成一个吧。

在命令提示行中,通过以下命令生成新的密钥:

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US"

密码是 android

validity设为10000可以保证数十年的期限。

将生成的keystore替换原有的。或者在eclipse – Window – preferences – Android – build中将路径改为新的keystore。

问题解决。

索尼(SONY)电子书阅读器Reader提供版本升级

索尼今天发布了其电子书Reader的固件升级以及其PC客户端eBook transfer for Reader的版本升级。

本次升级的主要变更点是提供了对 .book 格式的支持。这是一种由日本VOYAGER开发的电子书格式,被广泛用于漫画等内容。由此Reader所支持的书籍内容也更为多样。

从6月23日起,首批有讲谈社将提供1,360部.book格式的漫画(计约5,700册),以及约300部的书籍。在8月前预定发售的作品有:

【書籍】
「チルドレン」伊坂幸太郎※
「殺人行おくのほそ道(上)(下)」松本清張※
「NO.6〔ナンバーシックス〕 #1」あさのあつこ※
「エースの系譜」岩崎夏海※
「シューマンの指」奥泉光
「わかりやすく〈伝える〉技術」池上彰
「〈不安な時代〉の精神病理」香山リカ
「陽の鳥」樹林伸
「一瞬の風になれ 第一部 イチニツイテ」佐藤多佳子
「十津川警部 トリアージ 生死を分けた石見銀山」西村京太郎

【コミック】
「沈黙の艦隊」かわぐちかいじ※
「のだめカンタービレ」二ノ宮知子※
「寄生獣」岩明均※
「宇宙兄弟」小山宙哉※
「金田一少年の事件簿」天樹征丸・金成陽三郎・さとうふみや※
「進撃の巨人」諫山創
「華和家の四姉妹」柴門ふみ
「ちはやふる」末次由紀
「社長 島耕作」弘兼憲史
「FAIRY TAIL」真島ヒロ
「へうげもの」山田芳裕

现在购买Reader的话还能免费获取3900点的点数,可以用于购买书籍若干本。(我当初怎么没有这样的好事……)之前还与乐天等四家公司共同宣布将整合电子书在线商店,看来索尼对Reader的推进也是不遗余力呢。

最后需要说明的是,这次升级理论上是应该只针对日版的PRS-650和PRS-350进行的。美版不会得到升级支持。

索尼日本官方新闻稿

Android中调用摄像头并自动对焦拍照

代码与范例:
首先需要在Manifest文件中添加以下内容:

以使程序获取摄像头使用以及自动对焦功能的使用权限。

CameraTestActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class CameraTestActivity extends Activity {
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置横屏模式以及全屏模式
        setContentView(new CameraView(this)); //设置View
    }
}

CameraView.java

import java.io.FileOutputStream;

import android.content.Context;
import android.hardware.Camera;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback {
	private SurfaceHolder holder;
	private Camera camera;
	private boolean af;

	public CameraView(Context context) {//构造函数
		super(context);

		holder = getHolder();//生成Surface Holder
		holder.addCallback(this);

		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//指定Push Buffer
	}

	public void surfaceCreated(SurfaceHolder holder) {//Surface生成事件的处理
		try {
			camera = Camera.open();//摄像头的初始化
			camera.setPreviewDisplay(holder);
		} catch (Exception e) {
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//Surface改变事件的处理
		Camera.Parameters parameters = camera.getParameters();
		parameters.setPreviewSize(width, height);
		camera.setParameters(parameters);//设置参数
		camera.startPreview();//开始预览
	}

	public void surfaceDestroyed(SurfaceHolder holder) {//Surface销毁时的处理
		camera.setPreviewCallback(null);
		camera.stopPreview();
		camera.release();
		camera = null;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {//屏幕触摸事件
		if (event.getAction() == MotionEvent.ACTION_DOWN) {//按下时自动对焦
			camera.autoFocus(null);
			af = true;
		}
		if (event.getAction() == MotionEvent.ACTION_UP && af == true) {//放开后拍照
			camera.takePicture(null, null, this);
			af = false;
		}
		return true;
	}

	public void onPictureTaken(byte[] data, Camera camera) {//拍摄完成后保存照片
		try {
			String path = Environment.getExternalStorageDirectory() + "/test.jpg";
			data2file(data, path);
		} catch (Exception e) {
		}
		camera.startPreview();
	}

	private void data2file(byte[] w, String fileName) throws Exception {//将二进制数据转换为文件的函数
		FileOutputStream out = null;
		try {
			out = new FileOutputStream(fileName);
			out.write(w);
			out.close();
		} catch (Exception e) {
			if (out != null)
				out.close();
			throw e;
		}
	}

}

说明:这是一个简单的示例程序。功能是使用自动对焦功能拍摄一张照片保存于SD卡根目录下。需要注意的是要在manifest文件中声明相关的许可。本例中许多参数都没有设置,可以根据具体需要进行适当的修改以满足特定要求。

X10入手一周年纪念

又是一篇纪念文,入手X10也正好一年了。过去买的数码产品都会写些简单的感想文,而PS3也好X10也好却都没写。所以说是纪念,倒不如说是补完一下当时没写的东西。

X10是索尼爱立信的Android手机先驱之一。在表示要大力发展Android手机之后,发布了X10家族的Xperia X10、以及X10 mini和X10 mini pro(侧滑全键盘机型)。随后又发布了高性价比的终端型号Xperia X8。09年后半年发布时X10的硬件规格可谓是称雄Android手机。4英寸FWVGA分辨率的屏幕,810万像素的摄像头,加上1GHz主频的Qualcomm Snapdragon™ QSD8250处理器吸引了所有人的眼球。唯一的不足或许就是65536色的屏幕了吧。

之后的第一个危机是系统版本问题。在08年第一款Android手机G1的上市之后,Android系统的始终保持了高速发展,与苹果(Apple. Inc)的iOS系统一起抢占了移动设备操作系统的市场份额(怀念S60和频繁死机的N73……)与此同时也产生了Android系统的版本升级问题。由于各方利益的牵扯,很多手机都无法享受到始终保持最新系统的服务。虽然iOS也会在一些版本中因为硬件性能等原因不再支持过去机型,但似乎Android的这个问题尤为被人诟病。X10所搭载的Android 1.6系统在发布时还是最新,但是在半年之后却已经成为了过往版本,不由得让人遗憾。升级至2.1又是半年之后的事,可惜当时的最新版本已经是2.2。用着旧版本的系统郁闷而又无奈,也使索尼爱立信收到了大量的抱怨,很多人因此声称X10将会是他们的最后一部索尼爱立信手机。

在我看来这个问题倒不是特别难以接受。Moto也好htc也好也有很多得不到官方升级的机型,民间系统我也没什么兴趣。最重要的是1.6的系统也并不影响手机的使用,如果不存在2.1、2.2之类的新系统,是不会有人有怨言的吧。既然不影响生产力,那系统版本低就至多是遗憾而已了。性能不错加外形出众,X10已经足够了。

第二个问题则是X10的屏幕发色数问题。由于各种原因,X10的屏幕发色数只有65536色。发色数不足确实在一些方面会导致显示效果的下降。对于普通人来说确实完全无妨,但对比较看重硬件规格、对屏幕效果要求高的人来说,这也是一个不满之处。不过这一规格也是很早就公布了的,因此我想最终还是选择了X10的人,应该都是能接受这点的。

说了这么多之后,谈谈X10本身。使用了一年后的一些感想。

我是买的全球版水货。行货由于种种原因(最主要是软件差别+价格)实在是不能接受。很幸运的,用了一年似乎没有遇到什么硬件问题。

我个人觉得的X10的不足:

  • 音量偏轻。虽然我是完全能听清,不过也确实有很多人表示X10的通话音量太轻。老实说,我觉得最多是“音量上限不够大”吧,没有考虑到嘈杂环境的情况。

我个人觉得的X10的优点:

  • 在同等级手机中待机时间较长。虽然也没有多长…刚买回来那阵玩的厉害,一天都坚持不到。热情渐渐消退后,加上多次系统升级优化了电池性能,现在平均可以用两天。不过我一向是每天晚上充电的,既不费事,也能保证第二天外出时电力充足。(这里岔开说几句,我觉得手机白天保持开机某种意义上是一种可靠的表现。既然向朋友公开了手机号,就意味着同意对方在需要时可以随时联系到你。在这种情况下如果白天总是没电关机,别人有急事无法联系到你,不会很不好吗?偶尔一次两次倒是无所谓,不过有的人从来都是电池没电了才想到充电,实在是理解不了。)
  • 外观漂亮、性能尚可、拍照质量在手机里属上乘、系统界面美观等。(这些当时都是X10的卖点,就不多熬述了。)

另外要单独说的一点是多点触摸。X10最初是不支持多点的,官方称是屏幕硬件的限制。之后由于呼声过高,为其提供了有限的多点支持(仅多点缩放,不支持多点旋转)。我承认多点确实有有趣和有用的地方。不过对大多数人来说也不过是游戏而已。X10刚支持多点的那天我确实是很激动,只不过,在之后的很长时间里,都几乎没有用过多点功能…说到底,多点应该也不能算作是维持生产力的必须功能。(不然诺基亚怎么办 = =)

再过不久X10也将迎来2.3的系统升级了,这从某种意义上来说就像是一次重生。我觉得X10最大的意义其实在于为索尼爱立信提供了大量的Android手机的经验。X10之后的机型针对X10上出现的很多问题作了很多改进,新一代的旗舰机型Xperia arc可以说在各方面都已经相当出色。

至于下一次换手机,应该要等到索尼爱立信推出qHD分辨率屏幕手机的时候了。对我来说,屏幕分辨率才是最为重要的因素。

PS3入手两周年纪念

突然意识到,自己入手PS3至今已经整整两年了。

其实这两年里,真正玩游戏的时间并不多,玩的游戏数量更是很少。只买了四张游戏:使命召唤 现代战争、战场的瓦尔基里、最终幻想XIII,以及GT5。另外还有战地1943和Flower这两个下载版游戏。

其中使命召唤在一年多前通关,这款游戏无需多言,确实可以称得上是第一人称射击游戏的里程碑。战场的瓦尔基里在上个月刚刚通关。已经出到第三作的它现在也算是小有名气。PS3上的初代作品系统也比较简单,剧情也稍显单薄,不过崎元仁的音乐加上帆布风格的动画仍让它成为我相当中意的一款游戏。最终幻想XIII虽然当时是首发入手,但到现在却还没通关…画面确实非常出众,但缺乏变数的战斗系统和分支路线的缺乏令人有些失望。虽然仍可称得上是PS3上的经典之作,但遗憾之处似乎多了些。GT5目前处于不断前进的状态。已经取得了所有的执照,正在提升等级。GT5虽然不完美,但对我来说已经很满意了,各方面都是我所想要的样子。

战地1943最初很有意思,不过时间长了也就渐渐失去了热情。网络不流畅也许也是原因之一。Flower作为一款创意游戏,我想“治愈”这个词可以用来形容它。

游戏之外,PS3作为一台主机本身也是非常的出色。最大的优点可说是运行时相当安静。不过可能是用硬盘作为存储载体的缘故,数据读取的速度比想象中要慢一些。设计优良的游戏自然是避免了长时间的读盘,不过系统的等待是不可避免的了。

零散无章地随便说了几句,大概其实是在感慨时间已经过去两年了吧。越来越觉得时间流逝的速度在渐渐加快…又一个两年之后,会是怎样?

Android中EditText在软键盘弹出后自适应改变大小

在使用EditText的过程中遇到的一个问题:具有android:layout_height=”fill_parent”属性的EditText控件在弹出软键盘后高度仍然保持了原有的值,以至于最上方的内容无法被显示。

于是找了一下解决方法,意外的简单,只需要为该EditText控件添加android:scrollbars=”vertical”即可。

安全性和许可

Android是一个权限分离(privilege-separated)的操作系统,其中的每一个运行的程序有一个单独的系统识别(identity)(Linux 用户ID及组ID)。此外系统的不同部分也被分入了不同的识别。通过这种方式Linux使不同的程序和系统之间相互独立。

其他的高级安全特性也由一种称为“权限”的机制所提供,它强行规定了一个进程可以执行哪些特定操作,同时URI级别的权限(per-URI permission)担保了对于特定数据片段的ad-hoc访问。

安全构架

Android安全构架的一个中心设计要点就是默认来说没有程序有进行任何可能对其他程序、操作系统或是用户产生负面影响的任何操作的许可(permission)。这包括了读写用户私人数据(例如通讯录或是电子邮件),读写其他程序的文件,执行网络接入或保持设备不进入睡眠状态等。

因为内核将程序通过沙盒分离,所以程序必须显式地共享资源及数据。它们通过声明许可来获取它们所需的没有通过基本沙盒提供的额外功能。程序静态地声明它们所需的许可,Android系统将在程序安装时向用户征求许可。Android没有动态(在运行时)担保许可的机制,因为这将使安全性受损,使得用户体验变糟。

只有内核负责将程序通过沙盒与其他程序分离。尤其要注意Dalvik VM以及任何可以运行原生代码(native code)的程序(参见Android NDK)并不是安全边界。所有类型的程序——Java,原生(native)或是混合(hybrid)——都以同样方式被沙盒化,相互之间拥有相同的级别的安全性。

应用程序签名

所有的Android应用程序(.apk文件)必须用一个开发者拥有其私钥的认证(certificate)来进行签名。该认证用于识别应用程序的权限。一个认证不需要由认证权威来进行签名:Android程序完全可以,而且通常也会,使用自签名的认证。Android的认证的目的是为了识别应用程序作者。这使得系统可以允许或是拒绝程序获取签名级别(signature-level)的许可以及程序希望获取“相同作者程序”的Linux识别的请求。

用户ID与文件读取

在安装时,Android分给每一个包(package)一个独自的Linux用户ID。该识别将在这个包在设备上的整个周期内保持不变。在不同的设备上,同一个包可能会有不同的UID;不过重要的是在给定的某一个设备上每一个包都有一个独自的UID。

因为安全强化实在进程级别进行的,所以两个不同包的代码无法正常运行于同一个进程,他们需要作为不同的Linux用户运行。可以在每一个包的AndroidManifest.xml的manifest标签中使用sharedUserId属性来将其标为相同的用户ID。这样一来,这两个包就被认为是同一个程序,有同样的用户ID和文件权限了。注意为了保持安全性,只有两个有同样签名(且请求了同样的sharedUserId)的程序才会被分配同样的用户ID。

一个程序存储的任何数据会被分配以这个程序的用户ID,而无法被其他包正常访问。当使用getSharedPreferences(String, int),openFileOutput(String, int)或openOrCreateDatabase(String, int, SQliteDatabase.CursorFactory)来创建新文件时,可以用MODE_WORLD_READABLE和/或MODE_WORLD_WRITEABLE 旗标来允许其他包读/写该文件。当设置了这些旗标后,文件仍然属于原来的程序,但是因为设置了全局读/写许可,所以对任何其他程序都可见。

使用许可

一个基本的Android程序没有与之关联的许可,这意味着它无法进行任何可能影响用户体验或是影响设备上任何数据的操作。要利用这些设备上受保护的特性,就必须在AndroidManifest.xml文件中包含一个或更多的<uses-permission>标签来申明程序所需的许可。

例如,一个需要监视收到的短信的程序应该指定:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.app.myapp" >
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    ...
</manifest>

在程序安装时,基于用户对声明了许可和/或交互的程序签名的检查,包安装器(package installer)将会认可程序所请求的许可。在程序运行时不会进行任何检查:要么在安装时许可被允许而可以如所希望的那样使用该特性,要么许可不被认可,任何使用该特性的操作将不经过用户判断而直接拒绝。

通常许可错误会导致一个SecurityException被抛回程序。然而,这也不是在所有情况下都会发生的事。例如,sendBroadcast(Intent)方法会在方法调用被返回之后检查数据被传递至每一个接收者的许可,因此即使有许可错误,也不会收到异常。不过,在绝大多数情况下,许可失败都将会被打印于系统日志上。

Android系统所提供的许可可以在Manifest.permission中找到。任何程序也可以定义并执行其自有许可,因此那并非是所有可用许可的完整列表。

一个特定的许可可以在程序执行时被执行于多个地方:

  • 在系统执行一个调用时,阻止应用程序执行某一功能。
  • 在启动一个活动时,阻止应用程序启动属于其他程序的活动。
  • 在发送和接收广播时,控制广播的接收方和发送方。
  • 在读取并操作内容提供者时。
  • 在绑定或启动一个服务时。

声明并执行许可

要执行自有许可,就必须首先在AndroidManifest.xml中通过一个或多个<permission>标签来声明它们。

例如,如果一个程序希望可以控制谁能启动它的活动,它可以像这样为这个操作声明一个许可:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.me.app.myapp" >
    <permission android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"
        android:label="@string/permlab_deadlyActivity"
        android:description="@string/permdesc_deadlyActivity"
        android:permissionGroup="android.permission-group.COST_MONEY"
        android:protectionLevel="dangerous" />
    ...
</manifest>

<protectionLevel>属性是必需的,它会按链接文档中描述的那样告诉系统用户将如何被告知程序需要该许可,或是谁将被允许拥有这个许可。

<permissionGroup>属性是可选的,仅仅被用来帮助系统向用户显示该许可。通常会对一个标准系统组(standard system group)(列于android.Manifest.permission_group)或在某些特殊情况下对自己定义的系统组设置该属性。推荐使用一个已有的组,以简化向用户显示的许可界面。

注意必须同时向许可提供标签(label)和描述(description)。它们是用户在查看一列许可(android:label)或某一许可的详细内容(android:description)时将被显示的字符串资源。标签应当简短,用几个词描述该许可所保护的主要功能。描述可以是说明该许可允许持有者能做什么事的几句句子。习惯上用两句话来描述,第一句描述该许可,第二句告知用户当程序获得该许可后将有哪些可能的不良后果。

这是一个CALL_PHONE许可的标签和描述的例子:

   <string name="permlab_callPhone">directly call phone numbers</string>
    <string name="permdesc_callPhone">Allows the application to call
        phone numbers without your intervention. Malicious applications may
        cause unexpected calls on your phone bill. Note that this does not
        allow the application to call emergency numbers.</string>

可以通过shell指令adb shell pm list permissions来查看当前系统中所定义的许可。一般来说,’-s’选项将会像展示给用户看到的那样展示这些许可。

$ adb shell pm list permissions -s      
All Permissions:

Network communication: view Wi-Fi state, create Bluetooth connections, full
Internet access, view network state

Your location: access extra location provider commands, fine (GPS) location,
mock location sources for testing, coarse (network-based) location

Services that cost you money: send SMS messages, directly call phone numbers

...

在AndroidManifest.xml中执行许可

限制系统或程序的整体组件接入的高级别许可可以在AndroidManifest.xml中被应用。所需要做的只是将android:permission属性包含于所希望的组件之中,并为将被用于控制接入的许可命名。

Activity许可(应用于<activity>标签)限制了谁可以启动相关的活动。该许可在Context.startActivity()和Activity.startActivityForResult()的过程中会被检查;如果调用者没有所需的许可,该调用将抛出SecurityException。

Service许可(应用于<service>标签)限制了谁可以启动或是绑定相关的活动。该许可在Context.startService()、Context.stopService()和Context.bindService()的过程中会被检查;如果调用者没有所需的许可,该调用将抛出SecurityException。

BroadcastReceiver许可(应用于<receiver>标签)限制了谁可以向关联的接收者发送广播。该许可在Context.sendBroadcast()返回后系统试图向给定接收者传递所请求的广播时被检查。因此,许可错误不会向调用者抛出例外;它只是不会传递该意图。同样地,该许可可以用于Context.registerReceiver()控制谁可以向一个在代码中注册的接收者发送广播。另一方面,该许可也可以用于在调用Context.sendBroadcast()时限制哪一个BroadcastReceiver对象可以被允许接收广播(见下文)。

ContentProvider许可(应用于<provider>标签)限制了谁可以读取内容提供者内的数据。(内容提供者拥有一项重要的额外安全机制,允许它们调用URI许可。这将在之后说明。)和其他组件不同,内容提供者可以设置两个不同的属性:android:readPermission限制了谁可以读取该提供者,而android:writePermission限制了谁可以进行写操作。注意,如果一个提供者同时被读和写许可所保护,仅持有写许可并不意味着就可以读取提供者的内容。许可将在第一次检索一个提供者时和对提供者执行操作时被检查(如果没有持有任何一个许可,则将会抛出一个SecurityException)。使用ContentResolver.query()来请求持有读许可;使用ContentResolver.insert()、ContentResolver.update()和ContentResolver.delete()来请求写许可。在所有这些情况下,未持有所需的许可将导致调用抛出SecurityException 。

在发送广播时执行许可

另外,对于限制谁可以向一个注册的BroadcastReceiver发送Intent的许可(如同之前所描述的),还可以在发送广播时指定一个必需的许可。通过调用Context.sendBroadcast()及一个许可字符串,可以要求一个接收者程序必须持有该许可以接收广播。

注意,接收者和广播者都可以请求许可。在这时,Intent必须通过对两种许可的检查才能被传送至相关联的目标。

其他许可执行

强制的细化许可可以对任意服务调用执行。这通过Context.checkCallingPermission()方法执行。以一段所需的许可字符串调用后它将会返回一个整型值,显示该许可是否已被当前调用的进程所许可。注意这只能在执行来自另一进程中的调用时使用(这通常要通过一个由服务发布的IDL接口或是某些其他方法来实现)。

还有许多其他有用的检查许可的方法。如果拥有另一进程的pid,就可以用Context方法的Context.checkPermission(String, int, int)来检查违反该pid的许可。如有有另一个程序的包名,就可以直接用PackageManager方法PackageManager.checkPermission(String, String)来查看特定的包是否已经被某一指定许可所认可。

URI许可

在使用内容提供者时,至今所描述的标准许可系统常常是不足以胜任的。内容提供者可能需要读写许可以保护自己,同时它的直接客户端也需要处理其他程序的特殊URI以供执行操作。典型的例子是邮件程序中的附件。应当通过许可来保护对邮件的访问,因为这是用户敏感数据。不过,如果一个指向图像附件的URI被交给了图像查看器,该查看器将不会有打开附件的许可,因为它没有理由持有访问所有电子邮件的许可。

这个问题的解决方案是单URI许可(per-URI permission):当启动一个活动或是向一个活动返回结果时,调用者可以设置Intent.FLAG_GRANT_READ_URI_PERMISSION和/或Intent.FLAG_GRANT_WRITE_URI_PERMISSION。这将许可接收方访问Intent内的指定数据URI,而不论它是否拥有任何访问和Intent相对应的内容提供者中数据的许可。

这一机制使得常见的能力-风格模型(capability-style model)得以实现,用户交互操作(打开附件,从列表中选择联系人等)可以创建临时的细化许可权限。这是减少程序所需许可至仅有和其行为直接相关许可的工具。

然而,对细化URI许可的授权也需要一些拥有那些URI的内容提供者的配合。强烈建议内容提供者应用这一工具,通过android:grantUriPermissions属性或是<grant-uri-permissions>标签来声明它们支持这一特性。

更为详细的信息可以在Context.grantUriPermission()、Context.revokeUriPermission()和Context.checkUriPermission()方法中找到。

本作品采用知识共享 署名-非商业性使用-禁止演绎 3.0 Unported许可协议进行许可。

索尼(SONY)正式发表PS VITA

在今天E3 2011的索尼基调演讲中,索尼正式发表了之前代号为NGP的次世代PSP,其正式名称为PS VITA。

以下是当前公布的主机规格(来源为PlayStaion官网News Release):

商品名称 PlayStation®Vita
型号 PCH-1000 series
CPU ARM® Cortex™-A9 core (4 core)
GPU SGX543MP4+
外形尺寸 约182.0 x 18.6 x 83.5mm (长×厚×宽) (预定、除去最大突起)
屏幕(触摸屏) 5英寸(16:9)、960 x 544、约1677万色、OLED
多点触摸屏幕(电容式)
背面触摸板 多点触摸屏幕(电容式)
摄像头 正面摄像头、背面摄像头
帧率 : 120fps@320×240(QVGA), 60fps@640×480(VGA)
分辨率 : 最大640×480(VGA)
声音 内置立体声扬声器
内置麦克风
传感器 6轴感应系统(3轴陀螺仪・3轴加速度)、3轴电子罗盘
定位 内置GPS (仅限3G/Wi-Fi 版本)
支持Wi-Fi定位服务
按键・开关类 PS键
电源键
方向键(上下左右)
操作键(△、○、×、□键)
L键、R键
左摇杆、右摇杆
START键、SELECT键
音量+键、音量-键
无线通信机能 移动网络通信机能 (仅限3G/Wi-Fi 版本)
IEEE 802.11b/g/n (n = 1×1)标准(Wi-Fi) (基站模式/ad hoc模式)
Bluetooth® 2.1+EDR标准(支持A2DP/AVRCP/HSP)
主要接口/主要I/O PlayStation®Vita卡带插槽
记忆卡插槽
SIM卡插槽 (仅限3G/Wi-Fi版本 )
多用途接口 (USB数据通信/主机电源输入/声音输入输出[立体声输出/单声道输入]/兼容串口输入输出),
耳机/麦克风插口 (立体声迷你插口) (声音输入输出[立体声输出/单声道输入])
外设接口
电源 锂电池(主机内置)
AC电源适配器
对应编码格式 音乐
-MP3 MPEG-1/2 Audio Layer 3、MP4 (MPEG-4 AAC)、WAVE (Linear PCM)
视频
-MPEG-4 Simple Profile (AAC)、H.264/MPEG-4 AVC Hi/Main/Baseline Profile (AAC)
照片
-JPEG (Exif 2.2.1), TIFF, BMP, GIF, PNG

※「PlayStation」、「プレイステーション」或「PSP」是Sony Computer Entertainment股份公司的注册商标。
同时”PlayStation®Vita“也是该公司的商标。

※ ARM以及Cortex是ARM Ltd. 的商标及注册商标。

※ Bluetooth®ワードマーク及其Logo是Bluetooth SIG, Inc.所有的商标,Sony Computer Entertainment股份公司获得了使用该商标的许可。

※ 其他记载的名称是其各自公司的注册商标或是商标。

PS VITA的定价为:

Wi-Fi版本: 24,980日元(税后)/249美元/249欧元
3G/Wi-Fi版本: 29,980日元(税后)/299美元/299欧元

发售日未定

这个价格的性价比确实相当高,虽然还有电池续航时间等情报没有公开,不过入手也已经是板上钉钉的事了。继续期待进一步的消息。