{"action":"created","comment":{"url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/comments/48103408","id":48103408,"diff_hunk":"@@ -0,0 +1,364 @@\n+Android中的人脸检测入门\n+---\n+\n+> * 原文链接 : [An Introduction to Face Detection on Android](http://code.tutsplus.com/tutorials/an-introduction-to-face-detection-on-android--cms-25212?utm_source=Android+Weekly&utm_campaign=15ee59bb7a-Android_Weekly_181&utm_medium=email&utm_term=0_4eb677ad19-15ee59bb7a-337955857)\n+* 原文作者 : [Paul Trebilcox-Ruiz](http://tutsplus.com/authors/paul-trebilcox-ruiz)\n+* 译文出自 : [开发技术前线 www.devtf.cn](http://www.devtf.cn)\n+* 转载声明: 本译文已授权[开发者头条](http://toutiao.io/download)享有独家转载权，未经允许，不得转载!\n+* 译者 : [LangleyChang](https://github.com/LangleyChang) \n+* 校对者: [这里校对者的github用户名](github链接)  \n+* 状态 :  校对中\n+\n+\n+\n+\n+Introduced with the Vision libraries in Play Services 8.1, Face Detection makes it easy for you as a developer to analyze a video or image to locate human faces. Once you have a list of faces detected on an image, you can gather information about each face, such as orientation, likelihood of smiling, whether someone has their eyes open or closed, and specific landmarks on their face.\n+\n+随着Play服务8.1中引入了视觉库，作为一个开发者，Face Detection让你可以更容易的通过分析视频或图像来定位人脸(face)。一旦有了一个图像中人脸的列表，你就能获取到每个人脸的相关信息，比如方向，笑脸的概率，某人是睁眼还是闭眼，还有他们脸上特定的关键点(landmark)。\n+\n+This information can be useful for multiple applications, such as a camera app that automatically takes a picture when everyone in the frame is smiling with their eyes open, or for augmenting images with silly effects, such as unicorn horns. It is important to note that Face Detection is not facial recognition. While information can be gathered about a face, that information is not used by the Vision library to determine if two faces come from the same person.\n+\n+这些信息在很多应用中都有用，比如一个相机应用，它可以在每个人都在睁着眼笑的时刻拍一张照片，或者给图片加一些搞笑的效果，比如牛角什么的。有一点很重要，注意人脸检测(Face Detection)并不是人脸识别(facial recognition)。尽管都是在获取一张脸的信息，(Play服务中的)视觉库并不会用这些信息来分辨两张脸是不是来自同一个人。\n+\n+This tutorial will use a still image to run the Face Detection API and gather information about the people in the photo, while also illustrating that information with overlaid graphics. All code for this tutorial can be found on GitHub.\n+\n+这个教程会使用一张静止的图片来跑Face Detection API，然后获取有关照片中人物的信息。同时，还会在其上覆盖图形来展示获取到的信息。这个教程的所有代码都可以在[GitHub](https://github.com/tutsplus/Android-PlayServices-FaceDetection)上找到。\n+\n+\n+![](https://cms-assets.tutsplus.com/uploads/users/798/posts/25212/image/unicorn.png)\n+\n+Example of a silly effect adding a unicorn horn to a face\n+搞笑效果的例子，在人脸上添加牛角\n+1. Project Setup\n+\n+## 1. 建立项目\n+\n+To add the Vision library to your project, you need to import Play Services 8.1 or greater into your project. This tutorial imports only the Play Services Vision library. Open your project's build.gradle file and add the following compile line to the dependencies node.\n+\n+为了把视觉库添加到你的项目中，你需要把Play服务8.1或更高版本导入到你的项目。这个教程仅仅导入了Play服务视觉库(Play Servcies Vision library)。打开你项目的**build.gradle**文件，把如下的编译行添加到`dependencies`结点中\n+```groovy\n+compile 'com.google.android.gms:play-services-vision:8.1.0'\n+```\n+Once you have included Play Services into your project, you can close your project's build.gradle file and open AndroidManifest.xml. You need to add a meta-data item defining the face dependency under the `application` node of your manifest. This lets the Vision library know that you plan to detect faces within your application.\n+\n+一旦你在你的项目中包含了Play服务，你就可以关掉**build.gradle**文件，然后打开**AndroidManifest.xml**。你需要在`manifest`的`application`结点添加一个`meta-data`项来定义人脸检测的依赖。\n+```xml\n+<meta-data android:name=\"com.google.android.gms.vision.DEPENDENCIES\" android:value=\"face\"/>\n+```\n+Once you're finished setting up AndroidManifest.xml, you can go ahead and close it. Next, you need to create a new class named FaceOverlayView.java. This class extends View and contains the logic for detecting faces in the project, displaying the bitmap that was analyzed and drawing on top of the image in order to illustrate points.\n+\n+完成了`AndroidManifest.xml`的建立，你就可以直接关掉它了。接着，你需要创建一个叫`FaceOverlayView.java`的新类。这个类继承了`View`，并且包含着项目中人脸检测的逻辑，其中包括显示分析的位图并且在图像上绘制用以示意的点。\n+\n+For now, start by adding the member variables at the top of the class and defining the constructors. The Bitmap object will be used to store the bitmap that will be analyzed and the SparseArray of Face objects will store each face found in the bitmap.\n+\n+现在，在类的开头添加一个成员变量并且定义构造函数。`Bitmap`对象用来存储被分析的位图，`Face`对象中的`SparseArray`用来存储位图中发现的每张人脸。\n+\n+```Java\n+public class FaceOverlayView extends View {\n+ \n+    private Bitmap mBitmap;\n+    private SparseArray<Face> mFaces;\n+ \n+    public FaceOverlayView(Context context) {\n+        this(context, null);\n+    }\n+ \n+    public FaceOverlayView(Context context, AttributeSet attrs) {\n+        this(context, attrs, 0);\n+    }\n+ \n+    public FaceOverlayView(Context context, AttributeSet attrs, int defStyleAttr) {\n+        super(context, attrs, defStyleAttr);\n+    }\n+}\n+```\n+\t\n+\n+Next, add a new method inside of FaceOverlayView called setBitmap(Bitmap bitmap). For now this will simply save the bitmap passed to it, however later you will use this method for analyzing the image.\n+\n+接着，在`FaceOverlayView`中添加一个新的方法叫`setBitmap(Bitmap bitmap)`。这个方法当前只是简单把传给他的位图存起来，一会儿你要用这个方法来分析图像。\n+\n+```Java\n+public void setBitmap( Bitmap bitmap ) {\n+    mBitmap = bitmap;\n+}\n+```\n+Next, you need a bitmap. I have included one in the sample project on GitHub, but you can use any image that you would like in order to play with Face Detection and see what works and what doesn't. When you have selected an image, place it into the res/raw directory. This tutorial will assume that the image is called face.jpg.\n+\n+下一步，你需要一个位图。我已经在[GitHub](https://github.com/tutsplus/Android-PlayServices-FaceDetection)上的示例项目中包含了一张，但是你也可以拿你喜欢任何图片和Face Detection玩玩，看看哪些好使，哪些不好使。这个教程假设你的图片名为`face.jpg`。\n+\n+After you have placed your image into the res/raw directory, open res/layout/activity_main.xml. This layout contains a reference to FaceOverlayView so that it is displayed in MainActivity.\n+\n+把你的图片放在`res/raw`目录下之后，打开`res/layout/activity_main.xml`。这个布局包含了一个`FaceOverlayView`引用，这样就可以把它显示在`MainActivity`中。\n+\n+```xml\n+<?xml version=\"1.0\" encoding=\"utf-8\"?>\n+<com.tutsplus.facedetection.FaceOverlayView\n+\txmlns:android=\"http://schemas.android.com/apk/res/android\"\n+\tandroid:id=\"@+id/face_overlay\"\n+\tandroid:layout_width=\"match_parent\"\n+\tandroid:layout_height=\"match_parent\" />\n+```\n+With the layout defined, open MainActivity and set up the FaceOverlayView from onCreate(). You do this by getting a reference to the view, reading the face.jpg image file from the raw directory as an input stream, and converting that into a bitmap. Once you have the bitmap, you can call setBitmap on the FaceOverlayView to pass the image to your custom view.\n+\n+布局定义好了，现在打开`MainActivity`，在`onCreate()`中建立`FaceOverlayView`。怎么建立呢？你先获取一个这个view的引用，接着从raw目录的输入流中读取`face.jpg`文件，然后把它转换成一个位图。一旦你拿到了这个位图，你就可以调用`FaceOverlayView`的`setBitmap()`方法把这幅图像传给你自定义控件了。\n+\n+```Java\n+public class MainActivity extends AppCompatActivity {\n+ \n+    private FaceOverlayView mFaceOverlayView;\n+ \n+    @Override\n+    protected void onCreate(Bundle savedInstanceState) {\n+        super.onCreate(savedInstanceState);\n+        setContentView(R.layout.activity_main);\n+        mFaceOverlayView = (FaceOverlayView) findViewById( R.id.face_overlay );\n+ \n+        InputStream stream = getResources().openRawResource( R.raw.face );\n+        Bitmap bitmap = BitmapFactory.decodeStream(stream);\n+ \n+        mFaceOverlayView.setBitmap(bitmap);\n+ \n+    }\n+}\n+```\n+Detecting Faces\n+\n+## 2.检测人脸\n+Now that your project is set up, it's time to start detecting faces. In setBitmap( Bitmap bitmap ) you need to create a FaceDetector. This can be done using a FaceDetector.Builder, allowing you to define multiple parameters that affect how fast faces will be detected and what other data the FaceDetector will generate.\n+\n+既然你的项目已经建立完成了，现在就该开始检测人脸了。在`setBitmap(Bitmap bitmap)`中你需要创建一个`FaceDetector`。可以通过用一个`FaceDetector.Builder`来创建。它允许你定义多个参数，这些参数影响着你多快能检测出人脸和`FaceDetector`还能生成其他什么数据。\n+\n+The settings that you pick depend on what you're attempting to do in your application. If you enable searching for landmarks, then faces will be detected more slowly. As with most things in programming, everything has its trade-offs. To learn more about the options available for FaceDetector.Builder, you can find the official documentation on Android's developer website.\n+\n+你选择什么设置取决于你想在应用中做什么。如果你开启了关键点(landmark)搜索，那么检测人脸的速度就会慢一些。这和程序设计的大多数时候一样，鱼和熊掌不可兼得。想了解更多关于`FaceDetector.Builder`中的可用选项，你可以查看Android开发网站的官方文档。\n+\n+```Java\n+FaceDetector detector = new FaceDetector.Builder( getContext() )\n+        .setTrackingEnabled(false)\n+        .setLandmarkType(FaceDetector.ALL_LANDMARKS)\n+        .setMode(FaceDetector.FAST_MODE)\n+        .build();\n+```\n+You also need to have a check to see if the FaceDetector is operational. When a user uses face detection for the first time on their device, Play Services needs to go out and get a set of small native libraries to process your application's request. While this will almost always be done before your app has finished launching, it is important to handle the contingency that this has failed.\n+\n+同时，你也需要看看`FaceDetector`是否可用。当一个用户第一次在他的设备上使用人脸检测的时候，Play服务需要跳出来加载一系列小的原生库来处理你的请求。虽然大多数情况下这都能在你的应用结束前完成，你还是需要处理加载失败的意外情况。\n+If the FaceDetector is operational, then you can convert your bitmap into a Frame object and pass it to the detector to gather data about faces in the image. When you are done, you will need to release the detector to prevent a memory leak. When you are finished detecting faces, call invalidate() to trigger redrawing the view.\n+\n+如果`FaceDetector`是可用的，那你就可以把你的位图转成一个`Frame`对象，然后把它传给检测器来获取图像中关于人脸的数据。完成了以后，你需要释放检测器，防止内存泄漏。当人脸检测完成了以后，你就可以调用`invalidate()`来触发这个控件的重绘了。\n+\n+```Java\n+if (!detector.isOperational()) {\n+    //Handle contingency\n+} else {\n+    Frame frame = new Frame.Builder().setBitmap(bitmap).build();\n+    mFaces = detector.detect(frame);\n+    detector.release();\n+}\n+invalidate();\n+```\n+Now that you have detected the faces in your image, it's time to use them. For this example, you will simply draw a green box around each face. Since invalidate() was called after the faces were detected, you can add all of the necessary logic into onDraw(Canvas canvas). This method ensures that the bitmap and faces are set, then draw the bitmap onto the canvas, and then draw a box around each face.\n+\n+既然你已经从图像中检测到了人脸，现在就该用它们了。在这个例子中，你简单的在每个脸周围画一个绿框。因为`invalidate`已经在检测完人脸后调用了，所以你可以在`onDraw(Canvas canvas)`中添加必要的逻辑。这个方法得确保位图和人脸都已经设置好了，然后就开始在画布上绘制位图，再在每个脸的周围绘制一个框。\n+\n+Since different devices have different display sizes, you will also keep track of the bitmap's scaled size so that the entire image is always visible on the device and all overlays are drawn appropriately.\n+\n+因为不同的设备有不同的显示尺寸，你需要跟踪位图的缩放大小，让整个图片在不同的设备上都时刻可见，上面的覆盖物也要合适的绘制。\n+\n+```Java\n+@Override\n+protected void onDraw(Canvas canvas) {\n+    super.onDraw(canvas);\n+ \n+    if ((mBitmap != null) && (mFaces != null)) {\n+        double scale = drawBitmap(canvas);\n+        drawFaceBox(canvas, scale);\n+    }\n+}\n+```\n+The drawBitmap(Canvas canvas) method draws your bitmap onto the canvas and sizes it appropriately while also returning a multiplier for scaling your other dimensions correctly.\n+\n+`drawBitmap(Canvas canvas)`将你的位图绘制在画布上，并且把它的大小调整合适。同时，它还会返回一个系数以正确调整其他尺寸的比例。\n+\t\n+```Java\n+private double drawBitmap( Canvas canvas ) {\n+    double viewWidth = canvas.getWidth();\n+    double viewHeight = canvas.getHeight();\n+    double imageWidth = mBitmap.getWidth();\n+    double imageHeight = mBitmap.getHeight();\n+    double scale = Math.min( viewWidth / imageWidth, viewHeight / imageHeight );\n+ \n+    Rect destBounds = new Rect( 0, 0, (int) ( imageWidth * scale ), (int) ( imageHeight * scale ) );\n+    canvas.drawBitmap( mBitmap, null, destBounds, null );\n+    return scale;\n+}\n+\n+```\n+The drawFaceBox(Canvas canvas, double scale) method gets a little more interesting. Each face that was detected and saved has a position value above and to the left of each face. This method will take that position and draw a green rectangle from it to encompass each face based on its width and height.\n+\n+每一个检测出的人脸都有一个其左上角的位置信息。`drawFaceBox(Canvas canvas, double scale)`这个方法比较有趣，它会用利用这个位置按照每张脸的宽度和高度画一个绿色的矩形把它们都圈出来。\n+\n+You need to define your Paint object and then loop through each Face in your SparseArray to find its position, width, and height, and draw the rectangle on the canvas using that information.\n+\n+你需要定义你的`Paint`对象，然后循环遍历`SparseArray`的每一个`Face`找到它的位置，宽度和高度，然后用这些信息在画布上画出矩形。\n+\n+\n+```Java\n+private void drawFaceBox(Canvas canvas, double scale) {\n+    //paint should be defined as a member variable rather than \n+    //being created on each onDraw request, but left here for \n+    //emphasis.\n+    Paint paint = new Paint();\n+    paint.setColor(Color.GREEN);\n+    paint.setStyle(Paint.Style.STROKE);\n+    paint.setStrokeWidth(5);\n+ \n+    float left = 0;\n+    float top = 0;\n+    float right = 0;\n+    float bottom = 0;\n+ \n+    for( int i = 0; i < mFaces.size(); i++ ) {\n+        Face face = mFaces.valueAt(i);\n+ \n+        left = (float) ( face.getPosition().x * scale );\n+        top = (float) ( face.getPosition().y * scale );\n+        right = (float) scale * ( face.getPosition().x + face.getWidth() );\n+        bottom = (float) scale * ( face.getPosition().y + face.getHeight() );\n+ \n+        canvas.drawRect( left, top, right, bottom, paint );\n+    }\n+}\n+```\n+At this point, you should be able to run your application and see your image with rectangles around each face that has been detected. It is important to note that the Face Detection API is still fairly new at the time of this writing and it may not detect every face. You can play with some of the settings in the FaceDetector.Builder object in order to hopefully gather more data, though it's not guaranteed.\n+\n+现在，你的应用应该能跑了，并且你能看到图像中每一个检测出来的脸上都用矩形框了起来。注意，现在Face Detection API仍然相当稚嫩，所以它可能不会检测出每一张脸。你可以折腾折腾`FaceDetector`中的其他设置，看看能不能获得一些数据，尽管我也不能保证。\n+\n+![](https://cms-assets.tutsplus.com/uploads/users/798/posts/25212/image/facebox.png)\n+Faces detected and bound by a drawn rectangle\n+人脸被检测了出来并用矩形框出\n+3. Understanding Landmarks\n+## 3.理解关键点\n+Landmarks are points of interest on a face. The Face Detection API does not use landmarks for detecting a face, but rather detects a face in its entirety before looking for landmarks. That is why discovering landmarks is an optional setting that can be enabled through the FaceDetector.Builder.\n+\n+关键点是一个人脸中一些感兴趣的点。Face Detection API不用关键点来检测人脸，但是可以检测到脸的整体轮廓之后再寻找关键点。这就是为什么发现关键点在是一个可以用`FaceDetector.Builder`开启的可选选项。\n+\n+You can use these landmarks as an additional source of information, such as where the subject's eyes are, so that you can react appropriately within your app. There are twelve landmarks that are possible to find:\n+\n+你可以把这些关键点作为一个额外的信息源，比如对象的眼睛在哪里，这样你就可以在你的应用中恰当的交互。可被找到的关键点共有十二个：\n+\n+* left and right eye\n+* 左右眼\n+* \n+left and right ear\n+* 左右耳\n+* \n+left and right ear tip\n+* 左右耳廓尖\n+* \n+base of the nose\n+* 鼻子基部\n+* \n+left and right cheek\n+* 左右脸颊\n+* \n+left and right corner of the mouth\n+* 嘴的左右角\n+* \n+base of the mouth\n+* 嘴基部\n+\n+The landmarks that are available depend on the angle of the face detected. For example, someone facing off to the side will only have one eye visible, which means that the other eye will not be detectable. The following table outlines which landmarks should be detectable based on the Euler Y angle (direction left or right) of the face.\n+\n+哪些关键点是可用的取决于检测到的脸的角度。举个例子，某人的侧脸中只能检测到一个可见的眼睛，这意味着另一个眼睛是检测不到的。下面的表格概括了基于人脸的欧拉Y角度(左右方向)哪些关键点是可以被检测到的\n+\n+\n+| Euler Y        | Visible Landmarks          | \n+| ------------- |:-------------:| \n+| < -36°      | left eye, left mouth, left ear, nose base, left cheek | \n+| -36° to -12°      | left mouth, nose base, bottom mouth, right eye, left eye, left cheek, left ear tip     |  \n+| -12° to 12° | right eye, left eye, nose base, left cheek, right cheek, left mouth, right mouth, bottom mouth |  \n+| 12° to 36° | right mouth, nose base, bottom mouth, left eye, right eye, right cheek, right ear tip |\n+| > 36° | right eye, right mouth, right ear, nose base, right cheek |","path":"androidweekly/Android中的人脸检测入门.md","position":282,"original_position":282,"commit_id":"8c035ea3cf4e485eb5f349be3426f9564b99a17c","original_commit_id":"8c035ea3cf4e485eb5f349be3426f9564b99a17c","user":{"login":"desmond1121","id":11497762,"avatar_url":"https://avatars.githubusercontent.com/u/11497762?v=3","gravatar_id":"","url":"https://api.github.com/users/desmond1121","html_url":"https://github.com/desmond1121","followers_url":"https://api.github.com/users/desmond1121/followers","following_url":"https://api.github.com/users/desmond1121/following{/other_user}","gists_url":"https://api.github.com/users/desmond1121/gists{/gist_id}","starred_url":"https://api.github.com/users/desmond1121/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/desmond1121/subscriptions","organizations_url":"https://api.github.com/users/desmond1121/orgs","repos_url":"https://api.github.com/users/desmond1121/repos","events_url":"https://api.github.com/users/desmond1121/events{/privacy}","received_events_url":"https://api.github.com/users/desmond1121/received_events","type":"User","site_admin":false},"body":"表格内容也应该翻译一下","created_at":"2015-12-20T13:32:34Z","updated_at":"2015-12-20T13:32:34Z","html_url":"https://github.com/bboyfeiyu/android-tech-frontier/pull/496#discussion_r48103408","pull_request_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/496","_links":{"self":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/comments/48103408"},"html":{"href":"https://github.com/bboyfeiyu/android-tech-frontier/pull/496#discussion_r48103408"},"pull_request":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/496"}}},"pull_request":{"url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/496","id":54192065,"html_url":"https://github.com/bboyfeiyu/android-tech-frontier/pull/496","diff_url":"https://github.com/bboyfeiyu/android-tech-frontier/pull/496.diff","patch_url":"https://github.com/bboyfeiyu/android-tech-frontier/pull/496.patch","issue_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/issues/496","number":496,"state":"open","locked":false,"title":"An Introduction to Face Detection on Android翻译完成","user":{"login":"LangleyChang","id":6506398,"avatar_url":"https://avatars.githubusercontent.com/u/6506398?v=3","gravatar_id":"","url":"https://api.github.com/users/LangleyChang","html_url":"https://github.com/LangleyChang","followers_url":"https://api.github.com/users/LangleyChang/followers","following_url":"https://api.github.com/users/LangleyChang/following{/other_user}","gists_url":"https://api.github.com/users/LangleyChang/gists{/gist_id}","starred_url":"https://api.github.com/users/LangleyChang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LangleyChang/subscriptions","organizations_url":"https://api.github.com/users/LangleyChang/orgs","repos_url":"https://api.github.com/users/LangleyChang/repos","events_url":"https://api.github.com/users/LangleyChang/events{/privacy}","received_events_url":"https://api.github.com/users/LangleyChang/received_events","type":"User","site_admin":false},"body":"[issue#476](https://github.com/bboyfeiyu/android-tech-frontier/issues/476)","created_at":"2015-12-20T03:25:16Z","updated_at":"2015-12-20T13:32:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3422f6683eff3ecac603cfa45de087cf66550e61","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/496/commits","review_comments_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/496/comments","review_comment_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/issues/496/comments","statuses_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/statuses/8c035ea3cf4e485eb5f349be3426f9564b99a17c","head":{"label":"LangleyChang:master","ref":"master","sha":"8c035ea3cf4e485eb5f349be3426f9564b99a17c","user":{"login":"LangleyChang","id":6506398,"avatar_url":"https://avatars.githubusercontent.com/u/6506398?v=3","gravatar_id":"","url":"https://api.github.com/users/LangleyChang","html_url":"https://github.com/LangleyChang","followers_url":"https://api.github.com/users/LangleyChang/followers","following_url":"https://api.github.com/users/LangleyChang/following{/other_user}","gists_url":"https://api.github.com/users/LangleyChang/gists{/gist_id}","starred_url":"https://api.github.com/users/LangleyChang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LangleyChang/subscriptions","organizations_url":"https://api.github.com/users/LangleyChang/orgs","repos_url":"https://api.github.com/users/LangleyChang/repos","events_url":"https://api.github.com/users/LangleyChang/events{/privacy}","received_events_url":"https://api.github.com/users/LangleyChang/received_events","type":"User","site_admin":false},"repo":{"id":48265961,"name":"android-tech-frontier","full_name":"LangleyChang/android-tech-frontier","owner":{"login":"LangleyChang","id":6506398,"avatar_url":"https://avatars.githubusercontent.com/u/6506398?v=3","gravatar_id":"","url":"https://api.github.com/users/LangleyChang","html_url":"https://github.com/LangleyChang","followers_url":"https://api.github.com/users/LangleyChang/followers","following_url":"https://api.github.com/users/LangleyChang/following{/other_user}","gists_url":"https://api.github.com/users/LangleyChang/gists{/gist_id}","starred_url":"https://api.github.com/users/LangleyChang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LangleyChang/subscriptions","organizations_url":"https://api.github.com/users/LangleyChang/orgs","repos_url":"https://api.github.com/users/LangleyChang/repos","events_url":"https://api.github.com/users/LangleyChang/events{/privacy}","received_events_url":"https://api.github.com/users/LangleyChang/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/LangleyChang/android-tech-frontier","description":"一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目","fork":true,"url":"https://api.github.com/repos/LangleyChang/android-tech-frontier","forks_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/forks","keys_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/teams","hooks_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/hooks","issue_events_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/issues/events{/number}","events_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/events","assignees_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/assignees{/user}","branches_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/branches{/branch}","tags_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/tags","blobs_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/git/refs{/sha}","trees_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/statuses/{sha}","languages_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/languages","stargazers_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/stargazers","contributors_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/contributors","subscribers_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/subscribers","subscription_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/subscription","commits_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/commits{/sha}","git_commits_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/git/commits{/sha}","comments_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/comments{/number}","issue_comment_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/issues/comments{/number}","contents_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/contents/{+path}","compare_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/merges","archive_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/downloads","issues_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/issues{/number}","pulls_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/pulls{/number}","milestones_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/milestones{/number}","notifications_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/labels{/name}","releases_url":"https://api.github.com/repos/LangleyChang/android-tech-frontier/releases{/id}","created_at":"2015-12-19T02:47:43Z","updated_at":"2015-12-19T02:31:53Z","pushed_at":"2015-12-20T03:22:22Z","git_url":"git://github.com/LangleyChang/android-tech-frontier.git","ssh_url":"git@github.com:LangleyChang/android-tech-frontier.git","clone_url":"https://github.com/LangleyChang/android-tech-frontier.git","svn_url":"https://github.com/LangleyChang/android-tech-frontier","homepage":"http://www.devtf.cn","size":39137,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"bboyfeiyu:master","ref":"master","sha":"789c6e4a7ecb98c5c7cc228b5ca893e13337e566","user":{"login":"bboyfeiyu","id":1683811,"avatar_url":"https://avatars.githubusercontent.com/u/1683811?v=3","gravatar_id":"","url":"https://api.github.com/users/bboyfeiyu","html_url":"https://github.com/bboyfeiyu","followers_url":"https://api.github.com/users/bboyfeiyu/followers","following_url":"https://api.github.com/users/bboyfeiyu/following{/other_user}","gists_url":"https://api.github.com/users/bboyfeiyu/gists{/gist_id}","starred_url":"https://api.github.com/users/bboyfeiyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bboyfeiyu/subscriptions","organizations_url":"https://api.github.com/users/bboyfeiyu/orgs","repos_url":"https://api.github.com/users/bboyfeiyu/repos","events_url":"https://api.github.com/users/bboyfeiyu/events{/privacy}","received_events_url":"https://api.github.com/users/bboyfeiyu/received_events","type":"User","site_admin":false},"repo":{"id":32553922,"name":"android-tech-frontier","full_name":"bboyfeiyu/android-tech-frontier","owner":{"login":"bboyfeiyu","id":1683811,"avatar_url":"https://avatars.githubusercontent.com/u/1683811?v=3","gravatar_id":"","url":"https://api.github.com/users/bboyfeiyu","html_url":"https://github.com/bboyfeiyu","followers_url":"https://api.github.com/users/bboyfeiyu/followers","following_url":"https://api.github.com/users/bboyfeiyu/following{/other_user}","gists_url":"https://api.github.com/users/bboyfeiyu/gists{/gist_id}","starred_url":"https://api.github.com/users/bboyfeiyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bboyfeiyu/subscriptions","organizations_url":"https://api.github.com/users/bboyfeiyu/orgs","repos_url":"https://api.github.com/users/bboyfeiyu/repos","events_url":"https://api.github.com/users/bboyfeiyu/events{/privacy}","received_events_url":"https://api.github.com/users/bboyfeiyu/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bboyfeiyu/android-tech-frontier","description":"一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目","fork":false,"url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier","forks_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/forks","keys_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/teams","hooks_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/hooks","issue_events_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/issues/events{/number}","events_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/events","assignees_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/assignees{/user}","branches_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/branches{/branch}","tags_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/tags","blobs_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/git/refs{/sha}","trees_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/statuses/{sha}","languages_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/languages","stargazers_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/stargazers","contributors_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/contributors","subscribers_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/subscribers","subscription_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/subscription","commits_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/commits{/sha}","git_commits_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/git/commits{/sha}","comments_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/comments{/number}","issue_comment_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/issues/comments{/number}","contents_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/contents/{+path}","compare_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/merges","archive_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/downloads","issues_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/issues{/number}","pulls_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls{/number}","milestones_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/milestones{/number}","notifications_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/labels{/name}","releases_url":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/releases{/id}","created_at":"2015-03-20T00:36:37Z","updated_at":"2015-12-20T11:16:51Z","pushed_at":"2015-12-20T08:37:00Z","git_url":"git://github.com/bboyfeiyu/android-tech-frontier.git","ssh_url":"git@github.com:bboyfeiyu/android-tech-frontier.git","clone_url":"https://github.com/bboyfeiyu/android-tech-frontier.git","svn_url":"https://github.com/bboyfeiyu/android-tech-frontier","homepage":"http://www.devtf.cn","size":39783,"stargazers_count":3540,"watchers_count":3540,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1325,"mirror_url":null,"open_issues_count":23,"forks":1325,"open_issues":23,"watchers":3540,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/496"},"html":{"href":"https://github.com/bboyfeiyu/android-tech-frontier/pull/496"},"issue":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/issues/496"},"comments":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/issues/496/comments"},"review_comments":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/496/comments"},"review_comment":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/pulls/496/commits"},"statuses":{"href":"https://api.github.com/repos/bboyfeiyu/android-tech-frontier/statuses/8c035ea3cf4e485eb5f349be3426f9564b99a17c"}}}}