你不知道一些神奇Android Api

gffdfd 8年前
   <p>这将是一个关于Android Api的系列文章,AntSoft的Android 团队一直紧随技术前沿,在 <em>Budapest University of Technology and Economics</em> 培训Android技术已经有8年多的时间。公司里有个传统就是每周进行技术分享,这里将介绍一些Android平台上有意思的API。</p>    <p>当前Android已经有了非常多可用的依赖库(Library),但其实Android platform的一些API有些鲜为人知,但非常有用的方法和类,去研究一下这些API是非常有意思的。</p>    <p>我们知道Android API依赖的Java SE API也非常庞大,根据统计,Java SE 8有217个package,4240个方法,而java SE 7有209个package,4024个方法。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c76c6d2a7cc1a6323349cfcc74f7fef9.png"></p>    <p><em>source</em> : Java 8 Pocket Guide book by Robert Liguori, Patricia Liguor</p>    <p>demo App中给出的每个API的使用都是在不同的Activity中,从App首页可以进入到不同的API demoActivity。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f9fd5323e5515025d24173442661d13f.png"></p>    <h2>拼写检查</h2>    <p>Android从level 14开始有一个检查拼写的API,可以通过 TextServicesManager 使用,从level16开始已经可以甚至可以检查一个完整的句子了。</p>    <p>使用方法非常简单,通过 TextServicesManager 可以创建 SpellCheckerSession :</p>    <pre>  <code class="language-java">TextServicesManager tsm = (TextServicesManager) getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);    SpellCheckerSession spellCheckerSession = tsm.newSpellCheckerSession(null, null, this, true</code></pre>    <p>可以通过实现SpellCheckerSessionListener接口得到检查结果:</p>    <pre>  <code class="language-java">onGetSuggestions(SentenceSuggestionsInfo[] sentenceSuggestionsInfos)  onGetSentenceSuggestions(SentenceSuggestionsInfo[] sentenceSuggestionsInfos));</code></pre>    <p>SentenceSuggestionsInfo 数据中保存了正确的文字、偏移量以及所有相关的信息。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/61d5677faa38df0c6214b356c0aa9775.png"></p>    <p> </p>    <h2>文字识别</h2>    <p>这是 <em>Google Play Services Vision API</em> 中提供的功能,可以通过gradle dependency非常简单的引入到project中,需要注意的是不要引入整个 <em>Play Services</em> ,因为 <em>Play Services</em> 非常大,而我们需要的只是其中的一小部分, https://developers.google.com/android/guides/setup 中可以找到相关的帮助。</p>    <p>Vision API 中包含的服务有:</p>    <ul>     <li> <p>人脸识别</p> </li>     <li> <p>条形码扫描</p> </li>     <li> <p>文字识别</p> </li>    </ul>    <p>使用 Text Recognizer API 非常简单:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/df838180d856502faedc6543e59c8943.png"></p>    <p>首先,在build.gradle中引入依赖:</p>    <pre>  <code class="language-java">compile 'com.google.android.gms:play-services-vision:10.0.1'</code></pre>    <p>然后创建TextRecognizer对象:</p>    <pre>  <code class="language-java">TextRecognizer textRecognizer = new TextRecognizer.Builder(context).build();</code></pre>    <p>之后实现 Detector.Processor 接口接口监听结果,得到的结果是 TextBlock 数组。</p>    <pre>  <code class="language-java">public class OcrDetectorProcessor implements Detector.Processor<TextBlock> {        @Override      public void receiveDetections(Detector.Detections<TextBlock> detections) {          ...          SparseArray<TextBlock> items = detections.getDetectedItems();          ...      }        @Override      public void release() {      }  }</code></pre>    <p>合理地使用 TextRecognizer ,一般要自定义包含 SurfaceView 的View用于在屏幕显示结果。demo地址 OCRActivity , ocr 中有一些帮助类。</p>    <h2>TimingLogger</h2>    <p>TimingLogger 可以很容易地计算两个log信息之间的时间差,如下所示:</p>    <p>D/TAG_MYJOB: MyJob: begin</p>    <p>D/TAG_MYJOB: MyJob:      2002 ms, Phase 1 ready</p>    <p>D/TAG_MYJOB: MyJob:      2002 ms, Phase 2 ready</p>    <p>D/TAG_MYJOB: MyJob:      2001 ms, Phase 3 ready</p>    <p>D/TAG_MYJOB: MyJob: end, 6005 ms</p>    <p>使用 TimingLogger :</p>    <pre>  <code class="language-java">TimingLogger timings = new TimingLogger("TAG_MYJOB", "MyJob");</code></pre>    <p>然后通过 <em>addSplit(...)</em> 方法创建一个 log entry:</p>    <pre>  <code class="language-java">timings.addSplit("Phase 1 ready");</code></pre>    <p>当使用 <em>dumpToLog()</em> 后,log信息就会打印出来:</p>    <pre>  <code class="language-java">timings.dumpToLog();</code></pre>    <p>注意要使用TimingLogger, 要设置adb命令是Tag可用:</p>    <pre>  <code class="language-java">setprop log.tag.TAG_MYJOB VERBOSE</code></pre>    <p> </p>    <h2>截屏</h2>    <p>在某些情况下,截屏非常有用。也有一些第三方库如 Falcon 实现这个功能,从level 21开始 MediaProjection 可以实时获取屏幕内容和系统声音信息流。</p>    <p>qi,有时使用标准的Android API通过 getWindow() 非常简单地把屏幕内容保存为 Bitmap :</p>    <pre>  <code class="language-java">View viewRoot = getWindow().getDecorView().getRootView();    viewRoot.setDrawingCacheEnabled(true);    Bitmap screenShotAsBitmap = Bitmap.createBitmap(viewRoot.getDrawingCache());    viewRoot.setDrawingCacheEnabled(false);    // use screenShotAsBitmap as you need</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b54de70994ea726ec3db1ae00fe045f1.png"></p>    <p> </p>    <h2>PDF创建</h2>    <p>从level 19开始Android支持本地内容生成PDF文件。</p>    <p>首先创建一个PageInfo new PdfDocument.PageInfo.Builder(w,h,pageNum).create() ; ,然后使用PDFDocument中的 startPage([pageInfo]) 就可以创建一个PDF文件了。</p>    <p>以下的代码创建了一个demo.pdf文件:</p>    <pre>  <code class="language-java">public void createPdfFromCurrentScreen() {        new Thread() {          public void run() {              // Get the directory for the app's private pictures directory.              final File file = new File(                      Environment.getExternalStorageDirectory(), "demo.pdf");                if (file.exists ()) {                  file.delete ();              }                FileOutputStream out = null;              try {                  out = new FileOutputStream(file);                    PdfDocument document = new PdfDocument();                  Point windowSize = new Point();                  getWindowManager().getDefaultDisplay().getSize(windowSize);                  PdfDocument.PageInfo pageInfo =                          new PdfDocument.PageInfo.Builder(                          windowSize.x, windowSize.y, 1).create();                  PdfDocument.Page page = document.startPage(pageInfo);                  View content = getWindow().getDecorView();                  content.draw(page.getCanvas());                  document.finishPage(page);                  document.writeTo(out);                  document.close();                  out.flush();                    runOnUiThread(new Runnable() {                      @Override                      public void run() {                          Toast.makeText(PDFCreateActivity.this, "File created: "+file.getAbsolutePath(), Toast.LENGTH_LONG).show();                      }                  });              } catch (Exception e) {                  Log.d("TAG_PDF", "File was not created: "+e.getMessage());              } finally {                  try {                      out.close();                  } catch (IOException e) {                      e.printStackTrace();                  }              }          }      }.start();  }</code></pre>    <p> </p>    <p> </p>    <p>来自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0118/7051.html</p>    <p> </p>