因为我的主攻语言是javscript,对于之前来说,js还仅仅只在浏览器层面大放异彩,如今js在人工智能方面有tensorflow.js,在后端或者中间层方面有node.js,更不用说app,小程序了,甚至出现一套代码运行在5端,当然业界称其为web app,通俗解释就是在app里嵌套了画布(canvas),画布里嵌套了一个网页,对于java来说,它构建的native app是可以获取手机所有功能的,但是web app仅限于可以在显示方面与native app媲美,例子有闲鱼,京东都是web app,但是在操作系统api来说,web app差了很多,所以人们在此基础上开发出类java的js库,比如react native,native.js,因为我本人是学vue出身(顺便吐槽一下vue2.0还没学会,3.0就出了),所以我决定使用一下native.js(缺点在于社区不够好,案例少,所以我还是推荐使用react native)

此文章就是记录一下操作手机的api代码,也不准备深入学习,因为其实就是将java转化为js,本质还是java的思想。

1.读取手机的系统照片

plus.io.resolveLocalFileSystemURL("/storage/emulated/0/DCIM", function(entry) {
   console.log("Request file system successful");
   console.log(entry.isDirectory)
   entry.getDirectory("Camera", {
       create: false,
       exclusive: false
   }, function(dir) {
       console.log("Directory Entry Name: " + dir.name);
       var directoryReader = dir.createReader();
       directoryReader.readEntries(function(entries) {
           var i;
           for (i = 0; i < entries.length; i++) {
               console.log(entries[i].name);
           }
       }, function(e) {
           console.log("Read entries failed: " + e.message);
       });
   }, function() {
       console.log(e.message);
   });
}, function(e) {
   console.log("Request file system failed: " + e.message);
});

其实按照这个思路是可以读取所有照片的,因为已经达到的手机的底层,直接遍历所有文件夹查询其中的jpg,png,gif文件就可以,但是耗时过长所以我就没写,直接获取了相机拍照储存的默认相册,由于没跟后端结合,其实既然知道了每个图片在手机的地址,就可以上传并压缩到数据库储存。

2.读取手机的所有短信

var Context = plus.android.runtimeMainActivity();
var res = plus.android.invoke("android.support.v4.app.ActivityCompat", "checkSelfPermission", Context,
   "android.permission.READ_SMS");
var PERMISSIONS_STORAGE = new Array();
PERMISSIONS_STORAGE.push("android.permission.READ_SMS");
if (res != "0") {
   plus.android.invoke("android.support.v4.app.ActivityCompat", "requestPermissions", Context, PERMISSIONS_STORAGE, 1);
} else {
   var main = plus.android.runtimeMainActivity();
   var Uri = plus.android.importClass("android.net.Uri");
   var ContactsContract = plus.android.importClass('android.provider.ContactsContract');
   var uri = Uri.parse("content://sms/");
   var cr = main.getContentResolver();
   plus.android.importClass(cr);
   var cur = cr.query(uri, null, null, null, null);
   plus.android.importClass(cur);
   cur.moveToFirst();
   while (cur.moveToNext()) {
       var index_Address = cur.getColumnIndex("address");
       var address = cur.getString(index_Address);
       /*短信内容*/
       var index_Body = cur.getColumnIndex("body");
       var body = cur.getString(index_Body);
       /*类型1接收 2发送*/
       var index_Type = cur.getColumnIndex("type");
       var type = cur.getString(index_Type);
       console.log(address, body, type);
   }
   cur.close();
}

没什么好说的,java也是可以做到同样的地步,提示一下针对不同机型获取短信的程度不同,但是还是可以获取大部分短信。

3.获取通话记录

var CallLog = plus.android.importClass("android.provider.CallLog");
var main = plus.android.runtimeMainActivity();
var obj = main.getContentResolver();
plus.android.importClass(obj);
var cursor = obj.query(
   CallLog.Calls.CONTENT_URI,
   null,
   null,
   null,
   null
);
plus.android.importClass(cursor);
var content = [];
var count = 0;
if (cursor.moveToFirst()) {
   while (cursor.moveToNext()) {
       count++;
       var number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
       var type;
       switch (
          parseInt(cursor.getString(cursor.getColumnIndex(CallLog.Calls.TYPE))))
       {
           case CallLog.Calls.INCOMING_TYPE:
               type = "呼入";
               break;
           case CallLog.Calls.OUTGOING_TYPE:
               type = "呼出";
               break;
           case CallLog.Calls.MISSED_TYPE:
               type = "未接";
               break;
          default:
               type = "挂断"; 
               break;
      }
       var date = new Date(parseInt(
          cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.DATE))));
       var Name_Col = cursor.getColumnIndexOrThrow(CallLog.Calls.CACHED_NAME);
      var name = cursor.getString(Name_Col);
       var numberLocation = cursor.getString(
           cursor.getColumnIndex(CallLog.Calls.GEOCODED_LOCATION)
      );
       var Duration_Col = cursor.getColumnIndexOrThrow(CallLog.Calls.DURATION);
      var duration = cursor.getString(Duration_Col);
       content.push({
          name: name,
          mobile: number,
          numberLocation: numberLocation,
          callTime: new Date().getTime(date),
          talkTime: duration,
          type: type
      });
       if (count > 50) {
           break;
       }
   }
}
console.log(JSON.stringify(content));

4.获取通讯录

plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) { 
   addressbook.find(null, function(contacts) {
       var username = new Array();
       if (contacts.length > 0) { /*获取当前通讯录里面所有人*/
           for (var i = 0; i < contacts.length; i++) {
               if (contacts[i].phoneNumbers[0]) {
                   username.push(contacts[i].displayName + "-" + contacts[i].phoneNumbers[0].value);
               }
           }
       }
       console.log(username)
   }, function(e) {
       alert("Find contact error: " + e.message);
   });
}, function(e) {
});

5.静默拍照(用户不知情的情况下拍照)

只有这个我没有成功,可能是缺乏java知识的原因,但是好像java可以很轻松实现相关功能,只能把这个悬念留给以后的自己了
下面是无法成功调用的代码

var IntentMana = plus.android.importClass('android.content.Intent');
var MediaMana = plus.android.importClass('android.provider.MediaStore');
var App = plus.android.runtimeMainActivity();
var Uri = plus.android.importClass('android.net.Uri');
var intent = new IntentMana(MediaMana.ACTION_IMAGE_CAPTURE);
var ret = App.startActivityForResult(intent, 1000);

写这些代码的目的就是想看看app可以干多少坏事,也给自己敲了个警钟,原生app能做的远远比这个还多(其实我也尝试了批量删除手机所有文件,但是没有手机可以尝试就没运行)

在这提醒各位不要随便下载来源未知的app,同时不要随便给app各种权限!!!


浪子三唱,不唱悲歌