精华内容
下载资源
问答
  • Android实战——okhttp的使用和封装

    热门讨论 2016-11-01 20:03:11
    Android实战——okhttp的使用和封装
  • ANDROID 实战入门

    2014-07-06 21:20:31
    ANDROID 实战入门 http://dev.icybear.net/learning-android-cn/book.html
    ANDROID 
    实战入门  http://dev.icybear.net/learning-android-cn/book.html
    
    展开全文
  • Kotlin基础与Android实战

    2020-01-07 20:53:23
    - 带你学习Google强推的新静态语言Kotlin - 通俗易懂的囊括Kotlin语言基础 - 通过所学的Kotlin进行Android开发 - 所使用的的技术点  ... - Android项目实战     - Retrofit网络请求框架
  • Vulkan Android 实战 - 环境搭建

    千次阅读 2020-04-10 22:14:48
    大家好,接下来将为大家介绍Vulkan Android 实战 - 环境搭建。

    大家好,接下来将为大家介绍Vulkan Android 实战 - 环境搭建。

     

    首先:需要配置NDK,这一步操作非常关键:

    cd ~/Library/Android/sdk/ndk-bundle/sources/third_party/shaderc$

    ndk-build

    NDK_PROJECT_PATH=.

    APP_BUILD_SCRIPT=Android.mk

    APP_STL:=gnustl_static

    APP_ABI=all libshaderc_combined

     

    编译后,才可以正常的进行vulkandshader编译。

    展开全文
  • NDK撩妹三部曲(二)——论“Android 实战如何使用 C++(Qt) so 库这个神秘武器?”之带妹实战篇 从何说起?   上礼拜在妹子面前秀了一波后,妹子事后频频要请我喝奶茶,还说我明明可以靠脸吃饭,却偏偏要靠才华...

    NDK撩妹三部曲(一)—站住同学,我这有个C++的so库,底层运算效率飞起,想不想要?

    从何说起?

      上礼拜在妹子面前秀了一波后,妹子事后频频要请我喝奶茶,还说我明明可以靠脸吃饭,却偏偏要靠才华(我淦,内外兼修才是我追求的终极奥义)。坚持了3天,终于抵挡不住妹子的热情,当然,妥协是因为饥渴,不对,是因为奶茶,还不对,不是因为奶茶,而是本着助人为乐,共同学习,分享快乐的宗旨,献上我宝贵的“NDK”宝典。拂去1cm厚的灰尘,翻到,328页,对,就是这儿,“论 Android 实战如何使用 C++ so 库这个神秘武器?”。

    宝典摘要

      不管你是葵花宝典还是九阴真经,都少不了“摘要”、“目录”这几章吧,可千万不要小看了这一点点内容,它可是真正武功秘籍的浓缩所在,也就是说全是精华,可谓一字值千金,百字通气海。

      如果你是一个初学者,当拿到一个 so 库时,可能不知道怎么办了,因为“听说 Native 有点难呀”,老有人吓你。然后当你鼓足勇气挑战一下,我靠,JNI 真…踏马的麻烦。
      而又当你是一个老司机时,你一定会霹雳拍啦一阵操作,生成 JNI 头文件,再实现,再编译 so,看起来很简单,但是抬头一看,几个小时过去了,这还不包含可能出现的错误。当然了,有点夸张,只是举例说明一下 JNI 方式的繁琐。
      今天我们带妹子尝试另一种姿势,不对,另一种方式,使用 SUN 公司的 JNA 代替 JNI 的繁琐过程,一会儿你就知道这让我们调用 Native 方法有多舒服。

    和妹子一起操作

    一、新建 Android 项目,jnatest:

    在这里插入图片描述在这里插入图片描述
    进入 libs 文件夹,然后根据你需要的 Android ABI 建立相应的文件夹,如 arm64-v8a 、armeabi-v7a。

    二、从官网下载 JNA 包:

    https://github.com/java-native-access/jna/releases

    解压后,进入下图的目录:
    在这里插入图片描述
    上图中分别标识了不同的 Android ABI 对应的 JNA 库,把自己需要的 jar 包复制出来并解压,我们选择 android-aarch64.jar ,会得到一个 libjnidispatch.so 文件,将其复制到上面我们新建的 arm64-v8a 或者 armeabi-v7a 文件夹中。

    再次回到 dist 目录,复制里面的 jna-min.jarjna-platform.jar 粘贴到上面的 libs 目录。
    在这里插入图片描述

    三、依赖库拷贝

    3.1 如果你是个纯 C++ 的 so 库,到 ndk 目录下拷贝 libc++_shared.so 文件到上面的 rm64-v8a 目录。

    科普:
    libc++_shared 和 libgnustl_shared 均为 C++ 标准库,因为不同的 NDK 版本要求了不同的 C++ 标准。
       1、libc++,从 Lollipop 开始的官方安卓系统和现代 Mac 操作系统都将其作为C++标准库使用。从 NDK17 开始,它将成为 NDK 中唯一可用的 C+ + 标准实现。

       2、gnustl,libstdc++ 的别名,这两者在 GNU/linux 是同一个库。这个库的已被弃用,它在NDK 18 中被删除;

       3、STLport,由 STLport 项目编写的 C++ 标准库的第三方实现,自2008年以来一直处于不活跃状态。与gnustl一样,STLport在NDK 18 中被删除;

    3.2 如果你是个 QT 的 so 库,往下看:
      首先在任意地方新建一个文件夹,然后复制下面的内容命名为: android-libjnatest.so-deployment-settings.json

    {
       "description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.",
       "qt": "D:/WorkSoftware/QT5.12.0_for_Android/5.12.0/android_arm64_v8a",
       "sdk": "C:/Users/HiWin10/AppData/Local/Android/Sdk",
       "sdkBuildToolsRevision": "26.1.1",
       "ndk": "D:\\Java\\android-ndk-r16-windows-x86_64\\android-ndk-r16",
       "toolchain-prefix": "aarch64-linux-android",
       "tool-prefix": "aarch64-linux-android",
       "toolchain-version": "4.9",
       "ndk-host": "windows-x86_64",
       "target-architecture": "arm64",
       "stdcpp-path": "D:/Java/android-ndk-r16-windows-x86_64/android-ndk-r16/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so",
       "application-binary": "E:/VPlayer_git/release/arm64-v8a/libjnatest.so"
    }
    
    

    其次将你编译出的 so 库也放到此目录在此目录,
    最后打开 cmd 窗口,并输入以下内容。或者将下面的内容放到 test.bat 中,双击此 bat 文件执行:

    "D:/WorkSoftware/Qt5.12.0_for_android/5.12.0/android_arm64_v8a/bin/androiddeployqt.exe" --input E:/VPlayer_git/release/arm64-v8a/android-libjnatest.so-deployment-settings.json --output E:/VPlayer_git/release/arm64-v8a/android-build
    

    完成后可以看到在当前目录下创建了 android-build 目录,依次进入 libs 目录,再进入 arm64 目录,可以看到这里面即为当前你编译的 libjnatest.so 库要在 android 环境下运行所要依赖的库(此处我使用的是我们项目真正的库文件,只是修改了名字,这样更能贴近真实的情况。假如我用一个简单的 so 库测试,可能会出现和大家不一样的情况,比如依赖库不全等等问题)。
    在这里插入图片描述
    将上面这些库拷贝到第二步中的 rm64-v8a 文件夹中。然后别急,再将刚才 libs 目录下的 QtAndroid.jarQtAndroidBearer.jar 文件拷贝到第二步中的 rm64-v8a 的外层
    在这里插入图片描述
    即下图的目录。(是否有这两个 jar 包取决于我们编译的库是否有相关依赖,如果没有不用复制
    在这里插入图片描述

    四、万事俱备,只欠东风——修改 gradle 文件和添加 JNA 代码

    4.1 在 MainActivity 同级新建 Jna.java 文件,如下:

    package com.qht.jnatest;
    import com.sun.jna.Library;
    import com.sun.jna.Native;
    
    public interface Jna extends Library {
        /*
         * Step1:
         * JNA加载.so库,通过Native.loadLibrary()方法来加载,不带前缀“lib”
         */
        Jna INSTANCE = Native.loadLibrary("jnatest", Jna.class);
        /*
         * Step2:
         * 重写与C/C++源文件名称相同的方法,不需要用到的方法可以不用写
         */
        int test(int a,int b);
    }
    

    4.2 MainActivity 添加一句话即可:

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView tv = (TextView) findViewById(R.id.tv);
            int result = Jna.INSTANCE.test(20,500);
            tv.setText("引用so,计算结果:" + result);
        }
    }
    

    4.3 编辑 app 下的 build.gradle 文件:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "com.qht.jnatest"
            minSdkVersion 16
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        packagingOptions {
            exclude 'META-INF/XXXX'
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs'] //相当于将libs文件夹当做jnilibs文件夹
            }
        }
    }
    
    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        implementation 'com.android.support:appcompat-v7:28.0.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
        implementation files('libs/jna-min.jar') //将这4个jar包含到项目
        implementation files('libs/jna-platform.jar')
        implementation files('libs/QtAndroid.jar')
        implementation files('libs/QtAndroidBearer.jar')
    }
    
    

    完成之后 右键点击 jna-min.jar 包,选择add as library,最后点小锤子 make 一下:
    在这里插入图片描述
    如果不报错,再将项目切到 Android 视图,可以看到是不是多了一个 jniLibs 目录:
    在这里插入图片描述
    最后点击小三角,run:
    在这里插入图片描述

    我靠,刚过完 520,又来个 601,妹子这是给我什么暗号???


    csdn地址:http://blog.csdn.net/u012534831
    github地址:https://github.com/qht1003077897 \

    如有帮助,请多多点赞支持哦。

    展开全文
  • Android实战技巧之三十三 android hardware camera2使用指南
                         

    API 21中将原来的camera API弃用转而推荐使用新增的camera2 API,这是一个大的动作,因为新API换了架构,让开发者用起来更难了。
    先来看看camera2包架构示意图:

    这里引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送Capture请求,而摄像头会返回CameraMetadata。这一切建立在一个叫作CameraCaptureSession的会话中。

    下面是camera2包中的主要类:

    其中CameraManager是那个站在高处统管所有摄像投设备(CameraDevice)的管理者,而每个CameraDevice自己会负责建立CameraCaptureSession以及建立CaptureRequest。CameraCharacteristics是CameraDevice的属性描述类,非要做个对比的话,那么它与原来的CameraInfo有相似性。
    类图中有着三个重要的callback,虽然这增加了阅读代码的难度,但是你必须要习惯,因为这是新包的风格。其中CameraCaptureSession.CaptureCallback将处理预览和拍照图片的工作,需要重点对待。

    这些类是如何相互配合的?下面是简单的流程图。

    我是用SurfaceView作为显示对象(当然还可以TextureView去显示,详见参考中的项目)
    核心代码如下:

            mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);        mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);        mSurfaceHolder = mSurfaceView.getHolder();        mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {            @Override            public void surfaceCreated(SurfaceHolder holder) {                initCameraAndPreview();            }        });
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
        private void initCameraAndPreview() {        Log.d("linc","init camera and preview");        HandlerThread handlerThread = new HandlerThread("Camera2");        handlerThread.start();        mHandler = new Handler(handlerThread.getLooper());        try {            mCameraId = ""+CameraCharacteristics.LENS_FACING_FRONT;            mImageReader = ImageReader.newInstance(mSurfaceView.getWidth(), mSurfaceView.getHeight(),                    ImageFormat.JPEG,/*maxImages*/7);            mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mHandler);            mCameraManager.openCamera(mCameraId, DeviceStateCallback, mHandler);        } catch (CameraAccessException e) {            Log.e("linc", "open camera failed." + e.getMessage());        }    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    private CameraDevice.StateCallback DeviceStateCallback = new CameraDevice.StateCallback() {        @Override        public void onOpened(CameraDevice camera) {            Log.d("linc","DeviceStateCallback:camera was opend.");            mCameraOpenCloseLock.release();            mCameraDevice = camera;            try {                createCameraCaptureSession();            } catch (CameraAccessException e) {                e.printStackTrace();            }        }    };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
        private void createCameraCaptureSession() throws CameraAccessException {        Log.d("linc","createCameraCaptureSession");        mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);        mPreviewBuilder.addTarget(mSurfaceHolder.getSurface());        mState = STATE_PREVIEW;        mCameraDevice.createCaptureSession(                Arrays.asList(mSurfaceHolder.getSurface(), mImageReader.getSurface()),                mSessionPreviewStateCallback, mHandler);    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    private CameraCaptureSession.StateCallback mSessionPreviewStateCallback = new            CameraCaptureSession.StateCallback() {        @Override        public void onConfigured(CameraCaptureSession session) {            Log.d("linc","mSessionPreviewStateCallback onConfigured");            mSession = session;            try {                mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE,                        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);                mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE,                        CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);                session.setRepeatingRequest(mPreviewBuilder.build(), mSessionCaptureCallback, mHandler);            } catch (CameraAccessException e) {                e.printStackTrace();                Log.e("linc","set preview builder failed."+e.getMessage());            }        }    };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    private CameraCaptureSession.CaptureCallback mSessionCaptureCallback =            new CameraCaptureSession.CaptureCallback() {        @Override        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,                                       TotalCaptureResult result) {//            Log.d("linc","mSessionCaptureCallback, onCaptureCompleted");            mSession = session;            checkState(result);        }        @Override        public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,                                        CaptureResult partialResult) {            Log.d("linc","mSessionCaptureCallback, onCaptureProgressed");            mSession = session;            checkState(partialResult);        }        private void checkState(CaptureResult result) {            switch (mState) {                case STATE_PREVIEW:                    // NOTHING                    break;                case STATE_WAITING_CAPTURE:                    int afState = result.get(CaptureResult.CONTROL_AF_STATE);                    if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||                            CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState                            || CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED == afState                            || CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED == afState) {                        //do something like save picture                    }                    break;            }        }    };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    按下capture按钮:

        public void onCapture(View view) {        try {            Log.i("linc", "take picture");            mState = STATE_WAITING_CAPTURE;            mSession.setRepeatingRequest(mPreviewBuilder.build(), mSessionCaptureCallback, mHandler);        } catch (CameraAccessException e) {            e.printStackTrace();        }    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    测试用genemotion模拟器,直接调用笔记本的摄像头。
    配置图如下:

    demo界面如下图:

    源码:
    请参考github中的两个demo项目:
    https://github.com/pinguo-yuyidong/Camera2
    https://github.com/googlesamples/android-Camera2Basic

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • Android实战开发Handler机制深度解析

    千次阅读 2019-01-20 11:41:53
    本文为自己多年来在Android实战开发过程中总结归纳的一些常见问题,现在分享出来希望对初学者有所帮助。 本文出自门心叼龙的博客,转载请注明出处: https://blog.csdn.net/geduo_83/article/details/86560330  ...
  • Android实战技巧:深入解析AsyncTask

    万次阅读 多人点赞 2012-09-16 00:02:49
    关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复。 AsyncTask引发的一个问题 上周遇到了一个极其诡异的问题,一个小功能从网络上下载一个图片,然后放到...
  • Android实战——科大讯飞语音听写SDK的使用,实现语音识别功能
  • Android实战之悬浮球菜单App实现

    千次阅读 2019-10-24 19:27:30
    Android实战之悬浮球菜单App实现 该App已经基本完成,图片后续制作完成会上传,现在开始编写整个开发相关的个人学习过程,根据App的整体结构大致分为以下几个部分: ListView与RecyclerView 本次实战使用的...
  • Android实战——okhttp3的使用和封装

    万次阅读 2016-11-01 20:08:16
    Android实战——okhttp的使用和封装okhttp是什么使用作者的项目的原话:Android和Java应用程序的HTTP和HTTP / 2客户端 其项目地址:https://github.com/square/okhttpokhttp的使用我们针对okhttp的基本使用封装成...
  • Android实战项目:第一行代码CoolWeather

    千次阅读 热门讨论 2018-11-27 21:25:10
    Android实战项目:<<第一行代码>> 项目地址WeatherDemo:https://github.com/Tian-Zhen-Yin/WeatherDemo 项目分包: 依赖: dependencies { implementation file...
  • 终于还是要进行Android实战开篇系列了,年初就说过要进行这个系列专题。Android是一个很大的话题,作为非资深Android开发工程师(只是两年的Android系统开发及两年app开发经验而已),这里只是将Android开发所需的...
  • Android实战--手机卫士

    千次阅读 2013-10-27 17:58:18
    一个不错的学习工程:Android实战--手机卫士 http://blog.csdn.net/u011485531/article/category/1596831 作者:小斌91       Android项目实战--手机卫士32--给清理进程添加一个Widget 2013-10-...
  • Android实战技巧之二十五 模拟器如何重启 试试Genymotion
  • Android实战——jsoup实现网络爬虫,爬糗事百科主界面 本篇文章包括以下内容: 前言 jsoup的简介 jsoup的配置 jsoup的使用 结语 前言对于Android初学者想要做项目时,最大的烦恼是什么?毫无疑问是数据...
  • Android实战技巧之三十四 用TableLayout伪装表格显示数据
  • 10套Android实战经典资料分享

    千次阅读 2014-03-30 23:20:36
    10套Android实战经典资料分享 收集了10套Android学习资料,分享给大家,希望对学习这方面的朋友有帮助 1.实战Android手机客户端的家校通平台V1.0(SurfaceView实现统计图表) 下载地址:...
  • 9套Android实战经典项目资料分享给大家 通过项目学习收获更大。 1、基于Android平台实战爱短信项目 下载地址:http://pan.baidu.com/s/1hr8CEry 2、Android平台实战CRM客户关系管理(AChartEngine统计图表...
  • Android实战(五)------Myeclipse新建运行Android项目 这一节我们就通过给按钮添加事件的实例来熟悉下android开发的过程。 (因为其他控件也是类似的,只是定义和事件不同) 我这里根据 实战五的步骤...
  • 9套Android实战经典项目

    千次阅读 2020-04-30 09:37:08
    1、基于Android平台实战爱短信项目 下载地址:http://pan.baidu.com/s/1hr8CEry 2、Android平台实战CRM客户关系管理(AChartEngine统计图表、异步任务、系统性能优化) 下载地址: http://pan.baidu.com/s/1pKFPVvl 3...
  • Android 实战开发 三方SDK 讯飞语音SDK

    千人学习 2016-09-07 02:28:57
    Android 第三方SDK开发视频教程,给课程结合讯飞语音这个第三方SDK进行实战教学,实现在线语音合成,将文字信息转化为声音信息,给应用配上“嘴巴;语音听写,将连续语音识别为文字,给应用配上“耳朵”。
  • 关于Android实战篇系列,一直不知从何入手写。基本概念介绍对于实战篇系列来讲没有太大意义,本系列一如Spring实战篇系列所倡导的理念一样:知其然知其所以然,难点、疑点一网打尽(有点狂妄了)。还是决定从头开始...
  • Android 实战项目汇总

    千次阅读 2018-11-06 09:11:40
    功能性 学习性 android-oss 全球最大的众筹平台之一,有单元测试、自动化测试、自动化打包、持续集成等方面的经验
  • Android 实战开发 友盟统计SDK集成

    千人学习 2016-08-28 23:02:39
    友盟 简介 :为什么要学习友盟统计SDK,友盟统计的功能,怎样将友盟SDK集成到自己的项目中;以及在开发中要注意的问题;
  • 该课程主要为大家讲述Android技术开发的学习路线,并且将为Android程序员指出一条清晰明确的能够通往高薪岗位的路。
  • android 实战 制作聊天界面

    千次阅读 2019-06-02 21:35:24
    RecyclerView学了这么久,也应该来试一下实战了,这次来试一下做一个聊天界面,做聊天界面需要两张图片来分别做收到信息和发送信息的背景图,是需要制作Nine-Patch图片,做Nine-Patch图片也很简单,直接右键生成然后...
  • Android实战开发通用流行框架大全

    千次阅读 2019-01-22 23:47:01
    GitHub上受欢迎的Android UI Library https://mvnrepository.com/ https://jar-download.com/ https://docs.oracle.com/javase/7/docs/api/ ...
  • Android实战-个人App乐逗项目(第一阶段:微信精选文章完成与总结) 中的webview一样,采用腾讯x5浏览服务sdk调用的.效果 预览 : 所需 工具 : 腾讯x5浏览服务sdk 或者点击下载 jar 可以到官方下载,或者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,713
精华内容 8,285
关键字:

android实战