android原生_android原生浏览器 - CSDN
精华内容
参与话题
  • Flutter与Android原生代码交互

    千次阅读 2019-04-26 14:36:15
    一、概述 Flutter正式版已经出了一段时间了,作为刚入门的一个菜鸟而言,我还需要更多的学习。...下面仅关于flutter与Android原生的交互,希望能给像我一样的菜鸟们些微的帮助(只有Android是因为ios我还没开始写...

    一、概述

    Flutter正式版已经出了一段时间了,作为刚入门的一个菜鸟而言,我还需要更多的学习。
    最近开始的flutter项目用到了分享功能,但是到目前为止,微信,QQ等还没有出对flutter分享的SDK,这就需要用到flutter与Android和ios的原生交互。下面仅关于flutter与Android原生的交互,希望能给像我一样的菜鸟们些微的帮助(只有Android是因为ios我还没开始写哈哈哈)。

    二、开始编码(以分享功能为例)

    1. 首先在Flutter端创建一个方法调用工具类,便于方法调用管理:
    class ShareUtil {
      ///私有构造方法
      ShareUtil._();
    
      ///其中com.example/share用于唯一识别通道名称,
      /// 这个名字后边会在Android端使用到,必须跟Android端对应调用方法中的通道名称保持一致,否则无法调用
      static const MethodChannel _channel =
          const MethodChannel('com.example/share');
    
      ///shareTextWithMenu对应的是Android端可以通过这个名字调用对应的方法,如果Flutter端调用方法需要传递参数,可以用map传递,
      ///如下传递了一个map,其中存储text:text
      static Future<dynamic> shareTextWithMenu(String text) async {
        Map<dynamic, dynamic> result =
            await _channel.invokeMethod('shareTextWithMenu', {"text": text});
        return result;
      }
    
      ///Flutter调用是否安装了微信QQ等,需要Android端返回是否安装,用于flutter端调用方法时得到返回值。
      ///这个地方我使用了回调方法onResult
      static Future<dynamic> checkInstall(String platform,
          {Function onResult(bool isInstall)}) async {
        bool result =
            await _channel.invokeMethod('checkInstall', {"platform": platform});
        print("是否安装了${platform} =$result");
        if (onResult != null) onResult(result);
        return result;
      }
    
      ///Flutter调用三方登录,需要Android端返回是否登录成功,以及用户信息。
      ///onResult中存储了是否调用成功,以及成功之后获取到的用户信息
      static Future<dynamic> login(int platform,
          {Function onResult(Map<String, String> userInfo)}) async {
        Map<String, String> result =
            await _channel.invokeMethod('login', {"platform": platform});
        if (onResult != null) onResult(result);
        return result;
      }
    }    
    
    1. 然后在Android端对应方法:
    public class SharePlugin implements MethodCallHandler, ActivityResultListener {
        private final Registrar registrar;
        private ShareAction mShareAction;
    
        // 用于Activity中注册,com.secoo.yshangflutter/share和刚flutter端要相同
        public static void registerWith(Registrar registrar) {
            final MethodChannel channel = new MethodChannel(registrar.messenger(), "com.example/share");
            channel.setMethodCallHandler(new SharePlugin(registrar));
        }
    
        private SharePlugin(Registrar registrar) {
            this.registrar = registrar;
        }
    
        /// 分享sdk初始化
        private void init(Context context) {
            UMConfigure.init(context, "5c2f5016b465f54424000446", "umengshare", UMConfigure.DEVICE_TYPE_PHONE, "");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0
            PlatformConfig.setWeixin("wxdc1e388c3822c80b", "3baf1193c85774b3fd9d18447d76cab0");
            PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
            mShareAction = new ShareAction(registrar.activity()).setDisplayList(SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.WEIXIN_FAVORITE, SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE, SHARE_MEDIA.SINA);
        }
    
        ///方法调用,对应上边调用时使用的名字
        @Override
        public void onMethodCall(MethodCall call, Result result) {
            if (call.method.equals("shareTextWithMenu")) {
                String text = call.argument("text");
                shareText(text, result);
            } else if (call.method.equals("login")) {
                int platform = call.argument("platform");
                login(sharePlatForm(platform), result);
            } else if (call.method.equals("checkInstall")) {
                int platform = call.argument("platform");
                boolean flag = UMShareAPI.get(registrar.context()).isInstall(registrar.activity(), sharePlatForm(platform));
                result.success(flag);
            } else {
                result.notImplemented();
            }
        }
    
        ///返回值都存在result中,Flutter中调用方法_channel.invokeMethod()返回值就是result中的值
        private void shareText(final String text, final Result result) {
            mShareAction.setShareboardclickCallback(new ShareBoardlistener() {
                @Override
                public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
                    new ShareAction(registrar.activity()).setPlatform(share_media)
                            .withText(text)
                            .setCallback(new UMShareListener() {
                                @Override
                                public void onStart(SHARE_MEDIA share_media) {
                                    LoadingDialog.showLoading(registrar.activity());
                                }
    
                                @Override
                                public void onResult(SHARE_MEDIA share_media) {
                                    LoadingDialog.hideLoading();
                                    Map<String, Object> map = new HashMap<>();
                                    map.put("code", "000000");
                                    result.success(map);
                                }
    
                                @Override
                                public void onError(SHARE_MEDIA share_media, Throwable throwable) {
                                    LoadingDialog.hideLoading();
                                    Toast.makeText(registrar.activity(), throwable.getMessage(), Toast.LENGTH_LONG).show();
                                    Map<String, Object> map = new HashMap<>();
                                    map.put("code", "100000");
                                    map.put("msg", throwable.getMessage());
                                    result.success(map);
                                }
    
                                @Override
                                public void onCancel(SHARE_MEDIA share_media) {
                                    LoadingDialog.hideLoading();
                                    Toast.makeText(registrar.activity(), "已取消", Toast.LENGTH_LONG).show();
                                    Map<String, Object> map = new HashMap<>();
                                    map.put("status", "200000");
                                    result.success(map);
                                }
                            });
                }
            }).open();
        }
    
        private void login(SHARE_MEDIA platform, final Result result) {
            UMShareAPI.get(registrar.activity()).getPlatformInfo(registrar.activity(), platform, new UMAuthListener() {
                @Override
                public void onStart(SHARE_MEDIA share_media) {
                    Log.e("login", "onStart");
                }
    
                @Override
                public void onComplete(SHARE_MEDIA share_media, int i, Map<String, String> map) {
                    map.put("code", "000000");
                    result.success(map);
                }
    
                @Override
                public void onError(SHARE_MEDIA share_media, int i, Throwable throwable) {
                    Map<String, Object> map = new HashMap<>();
                    map.put("code", "100000");
                    map.put("msg", throwable.getMessage());
                    result.success(map);
                }
    
                @Override
                public void onCancel(SHARE_MEDIA share_media, int i) {
                    Map<String, Object> map = new HashMap<>();
                    map.put("code", "200000");
                    result.success(map);
                }
            });
        }
    
        private SHARE_MEDIA sharePlatForm(int index) {
            final SHARE_MEDIA platform;
            switch (index) {
                case 0:
                    platform = SHARE_MEDIA.WEIXIN;
                    break;
                case 1:
                    platform = SHARE_MEDIA.QQ;
                    break;
                default:
                    platform = SHARE_MEDIA.QQ;
                    break;
    
            }
            return platform;
        }
    
        @Override
        public boolean onActivityResult(int i, int i1, Intent intent) {
            UMShareAPI.get(registrar.activity()).onActivityResult(i, i1, intent);
            return false;
        }
    }
    
    1. 在继承了FlutterActivity的Activity中注册:
    public class MainActivity extends FlutterActivity {
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           GeneratedPluginRegistrant.registerWith(this);
           registerCustomPlugin(this);
       }
       ///注册刚刚写的原生方法通道
       private static void registerCustomPlugin(PluginRegistry registrar) {
           UmengsharePlugin.registerWith(registrar.registrarFor("com.example/share"));
       }
    }
    
    1. 在flutter控件中调用方法,并获取返回值:
    //分享按钮
     Widget _shareButton() {
       return GestureDetector(
         onTap: () {
           Share.shareTextWithMenu("分享分享测试");
           Share.checkInstall(Platform.QQ, onResult: (bool isInstall) {
             print("是否安装了QQ =$isInstall");
           });
           Share.login(Platform.QQ, onResult: (Map<String, String> userInfo) {
             print("登录用户信息=${userInfo.toString()}");
           });
         },
         child: ...
         );
    

    三、总结

    其实总结下来,flutter调用Android原生代码就一下四点

    1. flutter端创建一个MethodChannel,名字要和Android端的相同,并使用MethodChannel通过唯一方法名对应调用Android原生方法。
    2. Android端同样生成一个MethodChannel,名字要和上步骤Flutter中创建的相同。继承MethodCallHandler方法后实现onMethodCall(MethodCall call, Result result)方法,通过call拿到上步骤调用的唯一方法名实现不同的方法。
    3. 在继承了FlutterActivity的Activity中注册步骤2中实现了MethodCallHandler的通道。
    4. 开始在flutter的控件中调用原生方法。

    写的比较简单,是以完成项目目前的功能为前提下匆匆记录的,希望能帮助到一些人。

    展开全文
  • Google Android 原生Rom 下载地址及刷机教程 详见链接:https://developers.google.com/android/images#hammerheadkrt16m

    Google Android 原生Rom 下载地址及刷机教程(仅限开发者使用哈,里面需要用到一些Android 开发工具中带的命令行)

    详见链接:https://developers.google.com/android/images#hammerheadkrt16m

    展开全文
  • 自己动手刷原生android系统

    万次阅读 2016-08-29 12:02:42
    刷机呢,以前,1~2年之前,基本上用这大师,那助手什么的刷,一来图个方便,二来,似乎那时候从刷机软件刷进去的系统,有真正的原生android系统,或者,即使是被修改过的,绑进去的软件也还凑活,采用的欺骗手段...

    先说几句题外话。

    我本人而言,用过好几种android机,有nexus系列的,也有国内厂商的产品。刷机呢,以前,1~2年之前,基本上用这大师,那助手什么的刷,一来图个方便,二来,似乎那时候从刷机软件刷进去的系统,有真正的原生android系统,或者,即使是被修改过的,绑进去的软件也还凑活,采用的欺骗手段可能也不是很多,总的说来,即使我有一点儿洁癖,也能忍。

    但现在情况似乎恶化了,刷机软件刷的“原生系统”本来就是被修改过的,加入了N多东西,而且,有些还是所谓“臭名昭著”的这保镖、那管家什么的,不能忍吖,所以:只能自己动手了。

    自己手动刷机,多少还是需要一点儿技术的,其实会在windows的CMD下进行简单的操作就行了。

    这次的试验机,是一个Google Nexus 3,一般叫”Galaxy Nexus“,也叫i9250(三星的型号),是google nexus系列的第3代产品。选这个的主要原因是肯定能找到适合的原生android系统。


    好,开始。

    第一步:下载合适的android原生系统。我从这里下:

    https://developers.google.com/android/nexus/images?hl=zh-CN

    也许需要用代理,从Github上找个Lantern装上就可以了。

    页面长这样:



    把画红框的地方打上勾,表示“我已阅读并与上述同意条款和条件,请继续下载”(google翻译的)

    打勾后,才可以看见下载清单。往下翻吖翻,一直到出现 for Galaxy Nexus,下图:



    可以看到,针对GSM还是CDMA有不同的下载,我选GSM 4.3版,代号是JWR66Y的那个。

    点后面那个”Link“,正常的话就可以下载了。一共200多M。下载后是一个tar文件:

    yakju-jwr66y-factory-09207065.tar

    用WinRar打开并解压缩,得到一个文件:

    yakju-jwr66y-factory-0920706

    注意:这个文件是没有扩展名的。这时候,需要手动把扩展名改成rar(zip不行)。修改了扩展名后是这样的:

    yakju-jwr66y-factory-09207065.rar

    这时候,用Winrar打开这个文件,长这样:


    好,把这个目录(yakju-jwr66y)解出来,这个目录就是刷机的工作目录了:

    目录里面的东西:


    可以看到,目录里还有个zip文件,不过这个不用解压缩了。批处理文件“flash-all.bat”,就是windows下的刷机脚本。一会儿就用它。

    第一步到此结束。

    第二步:准备手机。这个就简单了,无非是打开”USB调试模式“,连上USB线就可以了。

    第三步:启动一个Windows终端(就是运行 cmd.exe了)。先用”adb devices“命令看看手机连上没有。连上了大概长这样:


    手机正确连上以后就可以开始刷机了。整个刷机过程在刚才那个下载页面上的”Flashing Instructions"这一段里有完整的介绍,下面的步骤(4~6)就是根据这个来的。

    第四步:用”adb reboot bootloader“命令把手机重启到fastboot模式,启动好了以后,手机变成这样:


    第五步:启动到fasetboot模式后,能看到手机又连上了。不放心用adb devices再看下。然后用”fastboot flashing unlock“命令,或者”fastboot oem unlock“把手机解锁。较老的机型,比如这个N 3,用后一个。

    第六步:解锁成功后,在终端上,进入刷机的工作目录,运行”flash-all"命令。剩下的过程就是全自动的了。刷完后,手机会启动到正常模式。这就算刷完了。


    如果要unlock,再执行一下第四步和第五步就行了。


    需要注意:这样刷完的,是尚未ROOT的。所以,如果有需求,还要专门找工具ROOT一次。


    展开全文
  • Android 显示原生Emoji

    万次阅读 2018-11-05 16:59:04
      1 前言 现在人们在聊天中越来越喜欢发表情了,文字毕竟比较生硬,有时候一个合适的表情,能更准确地传递我们想要表达的意思。除了一些火热的表情包之外,emoji 也是备受喜爱,这些表情或搞怪、或呆萌,比起...

    灵感来源于:http://blog.csdn.net/Alpha58/article/details/53449013

     

    1 前言

    现在人们在聊天中越来越喜欢发表情了,文字毕竟比较生硬,有时候一个合适的表情,能更准确地传递我们想要表达的意思。除了一些火热的表情包之外,emoji 也是备受喜爱,这些表情或搞怪、或呆萌,比起之前的 QQ 表情包可以说有过之而无不及。它们都能让别人一眼就看出你现在的情绪,相对于打一大堆文字,一个表情就能搞定,省事多了。
    但是 emoji 到底是个什么东西呢,我以前傻傻以为它跟 QQ 表情一样,是一些图片,手机系统内置了这些图片,但是最近才发现,可不是这么简单啊。
    emoji,绘文字,绘就是指图画,文字指的就是字符,就是把字符用图画的形式表现出来,最早是由日本人栗田穰崇创作,并在日本网络及手机用户中流行,自从 iPhone 在 iOS 5 的输入法中加入了 emoji 表情后,这股浪潮才开始席卷全球,目前已普遍应用于各手机短信及社交网络中。

    说到底,emoji 其实就是字符,在Unicode位于 \u1F601-\u1F64F 之间的字符。这个显然超过了目前常用的UTF-8字符集的编码范围 \u0000-\uFFFF,所以我们肯定不能直接使用 emoji 的 unicode 编码,所以我们需要对其进行转换。

     

    2 显示 emoji

    首先让我们来看一个 emoji(这个网站https://apps.timwhitlock.info/emoji/tables/unicode可以获取大部分 emoji 表情符号):

     

    这里可以看到 emoji 表情在不同平台的不同显示,是的,不同平台对同一个 emoji 的渲染方式可能不同。上图中有一个unicode,但是我们刚才说了,这个 unicode 不能直接用,别急,点击这个 unicode,你会看到:

     

    这其中有一栏 Surrogates,这个我们就可以直接用了。

    随便写个 TextView:

        <TextView
            android:id="@+id/tv_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="\uD83D\uDE01"
            android:textSize="30sp" />

     

    运行起来可以看到:

     

    什么?太麻烦了?不想每一个 emoji 都点进去查看 Surrogates ?好吧,那我们来想想能不能直接使用 unicode。U+1F601,去掉 U+ 的 1F601 其实就是个 16 进制的数,换算成 10 进制就是 128513,我们可以把这个 10 进制的数转成 String:

    ((TextView) findViewById(R.id.tv_test)).setText(new String(Character.toChars(128513)));

     

    这样效果也是一样的。

     

     

    3 抓取 emoji

    我们知道怎么显示 emoji 了,但是我们在使用的时候总不能一个一个去写吧,最好是把所有 emoji 存在一个文件里,然后显示在列表中,使用 python 中的 BeautifulSoup 库可以很轻松地从上面那个网站抓取下来每个 emoji 的 unicode 和 description,我对其处理了一下,去掉了两个 unicode 的 emoji,这种类型的显示比较麻烦一点,而且也不常用,然后去掉了 “U+”,把 16 进制的数转成了 10 进制。最后的 json 文件类似这样:

     

    总共 800 多个,相信应付一般的需求是没问题的了,美中不足的是这些描述都是老外写的,没有像什么“xk”(笑哭)、“wy”(无语)这样让我们容易理解的简称,如果我们需要发送的话,这些代号只能自己手写了。

    列表效果演示:

     

    4 总结

    可以看到 Android 与 iOS 的显示是不一样的,就算同为 Android,不同手机也可能显示不一样,测试了一个三星手机,一个 metal 和一个 nexus,三个都不一样。。。其中 nexus 是 Google 原生的,metal 却是跟 iOS 一样,这个仁者见仁智者见智吧,有人喜欢统一,也有人觉得不用千篇一律的非得一样,保持各自特点比较好。使用字符的话当然比使用图片要省时省体积得多,这次的摸索其实还顺带练手了爬取数据的能力,例子太简单就不放代码了,这里面最有价值的应该是有 emoji unicode 码的 Json 文件,大家如果有需要的话可以在下面的链接中下载。

     

    5 Github 传送门

    最有价值的 Json 文件在 Demo 的 assets 文件夹中

    展开全文
  • android原生定位

    2019-05-30 14:03:49
    public class LocationUtils { public static int GPS_REQUEST_CODE = 999; private LocationManager locationManager; private static final int REQUEST_CONTACTS = 1; private static final Str...
  • 安卓原生镜像(中国网站)

    万次阅读 2019-03-04 16:17:07
    安卓原生镜像(谷歌中国站) 找了半天百度,好不容易看到,赶紧收藏起来: 原生安卓包: https://developers.google.cn/android/images?h1=zh=cn#angler
  • Android 原生系统,手机rom下载网站

    万次阅读 2017-08-16 17:06:15
    Android, 原生系统,手机rom,下载网站
  • 怎么用Android原生的分享功能分享链接啊。希望实现分享到微信。QQ。还有微博。点击分享内容可以跳转到所分享的网址
  • Flutter与Android原生的交互

    万次阅读 2018-07-02 01:13:11
    Flutter发布Preview版本后热度持续上升,但是仍然有很多不足之处,所有前期还是采用与原生结合的混合开发,那就需要了解Flutter与原生的交互的一些方法。 原生启动Flutter Activity 新建Flutter 项目默认启动...
  • 现在好多项目上都会用到日期和时间选择,Android就有一款原生的,先看效果 上面是效果图,实现代码很简单,如下: /** * 日期选择 * @param activity * @param themeResId * @param tv * @param ...
  • Android原生Google系统

    万次阅读 2019-04-04 15:45:49
    https://download.pixelexperience.org/ https://download.lineageos.org/
  • Google 原生ROM下载

    万次阅读 2014-04-11 23:13:50
    https://developers.google.com/android/nexus/images
  • Android 原生加载框

    千次阅读 2016-01-07 10:56:43
    1、定义为全局变量 private ProgressDialog progressDialog; 2、显示加载框 /** * 加载框 */ public void buildProgressDialog(int id) { if (progressDialog == null) { progressDialog = new ...
  • App混合开发(英文名:Hybrid App),是指在开发一款App产品的时候为了提高效率、节省成本...原生应用开发,是在Android、IOS等移动平台上利用官方提供的开发语言、开发类库、开发工具进行App开发。比如android是利用j
  • 安卓官方原生系统与AOSP区别

    万次阅读 2016-01-18 14:37:40
    AOSP,“Android Open-Source Project”的缩写,中文意为“Android开放源代码项目”。在Android Open-Source Project社区,你可以找到你所需要参与开发的Android兼容设备的信息和相关源代码。Android是一个开源的,...
  •  http://www.2cto.com/kf/201110/108575.html // 调用系统锁屏 http://www.tongleer.com/1268.html // 原生锁屏
  • 历代的Android系统总是...后台回复:「安卓原生壁纸」即可获取10张高清原图下载链接正是如此,Android原生系统总是给人一种年轻奔放,活力四射,原生App的icon图标也非常可爱,当然了壁纸也是。后台回复:「安卓原生壁
  • js调用原生android应用的方法

    万次阅读 2018-04-24 15:49:28
    目前混合应用开发也在前端这块中有一定的应用范围了,但是js与app的交互就是需要解决的最主要问题了,下面写了简单例子来说明js如何条用app的方法,以android为例:首先,新建一个android工程,在工程中新建一个和js...
  • 修改Android原生字体

    千次阅读 2016-10-12 10:06:36
    首先我们来看一下,android原生字体放在哪个目录下.没错,android的原生字体在系统的system/fonts里面,我这个里面有大量的.ttf文件字体,是因为我之前用串口拷进去的.其实android原生字体只用了3个.ttf的文件.上图中用...
  • 假设现在Android原生代码中有一个本地函数:androidNativeSayHello(),打算提供给外部H5页面使用。 第一步,在Android原生代码中准备好提供给H5网页调用的本地原生函数: import android.content.Context; import ...
1 2 3 4 5 ... 20
收藏数 98,856
精华内容 39,542
关键字:

android原生