精华内容
下载资源
问答
  • android教程

    千次阅读 2018-04-03 11:46:01
    http://www.runoob.com/w3cnote/android-tutorial-android-studio.html本节将介绍如何使用Android Studio开发Android APP,和前面Eclipse + ADT + SDK搭建Android开发环境一样,本节也只是介绍一些基本东西,深入的...

    http://www.runoob.com/w3cnote/android-tutorial-android-studio.html

    本节将介绍如何使用Android Studio开发Android APP,和前面Eclipse + ADT + SDK搭建Android开发环境一样,本节也只是介绍一些基本东西,深入的,比如快捷键,小技巧等会再另一篇文章中详细地介绍!

    1.下载Android Studio


    官网下载:Android Studio for Window ... 百度云下载:android-studio-bundle-141.1903250-windows.exe


    2.安装Android Studio

    傻瓜式的下一步而已,只列出需要注意的页面:

      


    3.新建工程

    安装完毕后,打开我们的Android Studio,第一次启动需要下载SDK等一些东西,时间比较长,笔者等了大概40分钟才下载完毕

    选择第一项,新建一个Android项目

    选择开发程序将运行在哪个平台上:

    选择Activity的风格:

    设置进入程序一个页面后的Activity的一些信息

    Finish然后是漫长的等待~


    4.IDE的界面分析

    先看下整个界面吧:

    接着看下我们的项目结构,而我们一般关心的只是app这个目录:


    5.运行下程序试试

    点击菜单栏的X,即可运行程序:

    此处输入图片的描述


    6.本节小结

    Android Studio的用法还是比较简单的,当然笔者也是刚用Android Studio,后续还会写一篇更深入一点的文章,这里大家琢磨琢磨,暂时能跑起程序,知道在哪里写代码,怎么看Logcat就可以了!


    展开全文
  • Android教程之MediaStore

    千次阅读 2010-08-04 20:53:00
    Android教程之MediaStore

    MediaStore这个类是 android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括 音频,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉 用那些封装好的接口就可以进行数据库的操作了。今天我就介绍一些这些接口的用法。

    首先,要得到一个ContentResolver实例,ContentResolver可以这样获取,利用一个Activity或者Service的Context即可。如下所示:

    ContentResolver mResolver = ctx.getContentResolver;

    上面的那个ctx的就是一个context,Activity.this就是那个Context,这个Context就相当于一个上下文环境。 得到这个Context后就可以调用getContentResolver接口获取ContentResolver实例了。 ContentResolver实例获得后,就可以进行各种查询,下面我就以音频数据库为例讲解增删改查的方法,视频和图像和音频非常类似。

    在讲解各种查询之前,我给大家介绍下怎么看android都提供了哪些多媒体表。在adb shell中,找到/data/data/com.android.providers.media/databases/下,然后找到SD卡的数据库文 件(一般是一个.db文件),然后输入命令sqlite3加上这个数据库的名字就可以查询android的多媒体数据库了。.table命令可以列出所有 多媒体数据库的表,.scheme加上表名可以查询表中的所有列名。这里可以利用SQL语句来查看你想要的数据,记得最后一定要记住每条语句后面都加上分 号。下面开始讲述怎么在这些表上进行增删改查。

    查询,代码如下所示:

    Cursor cursor = resolver.query(_uri, prjs, selections, selectArgs, order);

    ContentResolver的query方法接受几个参数,参数意义如下:

    Uri:这个Uri代表要查询的数据库名称加上表的名称。这个Uri一般都直接从MediaStore里取得,例如我要取所有歌的信息,就必须利用 MediaStore.Audio.Media. EXTERNAL _CONTENT_URI这个Uri。专辑信息要利用MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI这个 Uri来查询,其他查询也都类似。

    Prjs:这个参数代表要从表中选择的列,用一个String数组来表示。

    Selections:相当于SQL语句中的where子句,就是代表你的查询条件。

    selectArgs:这个参数是说你的Selections里有?这个符号是,这里可以以实际值代替这个问号。如果Selections这个没有?的话,那么这个String数组可以为null。

    Order:说明查询结果按什么来排序。

    上面就是各个参数的意义,它返回的查询结果一个Cursor,这个Cursor就相当于数据库查询的中Result,用法和它差不多。

    增加,代码如下所以:

    ContentValues values = new ContentValues;

    values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER,0);

    resolver.insert(_uri, values);

    这个insert传递的参数只有两个,一个是Uri(同查询那个Uri),另一个是ContentValues。这个ContentValuses对应于数据库的一行数据,只要用put方法把每个列的设置好之后,直接利用insert方法去插入就好了。

    更新,代码如下:

    ContentResolver resolver = ctx.getContentResolver;

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

    ContentValues values = new ContentValues;

    values.put(MediaStore.Audio.Media.DATE_MODIFIED, sid);

    resolver.update(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,values, where, selectionArgs);

    上面update方法和查询还有增加里的参数都很类似,这里就不再重复叙述了,大家也可直接参考google的文档,那里也写的很清楚。

    删除,代码如下:

    ContentResolver resolver = ctx.getContentResolver;

    resolver.delete(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,where, selectionArgs);

    delete和更新的方法很类似,大家对照更新的方法看下马上就会明白,今天就写到这里了最近比较忙,打算一周发一篇心得体会吧,希望大家也把自己的开发心得写出来多多交流。

    展开全文
  • 菜鸟android教程

    千次阅读 2018-04-11 18:14:01
    http://www.runoob.com/w3cnote/android-tutorial-fragment-demo4.html点击打开链接
    http://www.runoob.com/w3cnote/android-tutorial-fragment-demo4.html点击打开链接
    展开全文
  • opencv for android 教程(环境搭建篇)

    万次阅读 多人点赞 2013-05-21 23:55:05
    由于opencv for android 网上教程大多为英文文档,中文教程都为零星篇章, 很少有完整的opencv for android 教程 博主最近正在学习opencv for android 其中走了很多弯路 所以将一些经验写下 帮助大家少走弯路! 只...

    前言:

    (这篇文章比较老了~这里给大家一些新的文章链接地址 谢谢大家支持!)

       最近android开发异常火热,随着手机性能越来越高,图像处程序也越来越重要,
    由于opencv for android 网上教程大多为英文文档,中文教程都为零星篇章,
    很少有完整的opencv for android 教程
    博主最近正在学习opencv for android 其中走了很多弯路
    所以将一些经验写下 帮助大家少走弯路!
    只适合初学者 请大神指正,或者绕道吧,走好不送!

    注意本文只负责环境的搭建 不负责讲解
    按照文章来确保能搭建一个完美的opencv for android 的开发环境
       但是具体的理解 需要读者自己尝试和摸索!

    准备工具:

    • win7/win8 环境我是win8环境
    • java SDK 6 / 7       我是用的6
    • eclipse for java EE IED我是32位版
    • ADT插件
    • CDT插件
    • Android SDK
    • Android NDK我的是r8版
    • cygwin
    • Sequoyah
    • opencv for android我用的是2.4.5


    android环境搭建:

    java SDK安装:


    如果你还没有JDK的话,可以去这里下载,接下来的工作就是安装提示一步一步走。设置环境变量步骤如下:

    1. 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:
    2. JAVA_HOME值为: D:\Program Files\Java\jdk1.6.0_18(你安装JDK的目录
    3. CLASSPATH值为:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin;
    4. Path:  在开始追加 %JAVA_HOME%\bin;
    5. NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以跳过。

    安装完成之后,可以在检查JDK是否安装成功。打开cmd窗口,输入java –version 查看JDK的版本信息。出现类似下面的画面表示安装成功了:



    eclipse 安装:

       1.下载
    2.解压到任意目录
    3.去目录启动
    4.设置工作路径
    5.安装完成

    Android SDK安装:

    在Android Developers下载android-sdk_r05-windows.zip,下载完成后解压到任意路径。

    • 运行SDK Setup.exe,点击Available Packages。如果没有出现可安装的包,请点击Settings,选中Misc中的"Force https://..."这项,再点击Available Packages 。
    • 选择希望安装的SDK及其文档或者其它包,点击Installation Selected、Accept All、Install Accepted,开始下载安装所选包
    • 在用户变量中新建PATH值为:Android SDK中的tools绝对路径(本机为D:\AndroidDevelop\android-sdk-windows\tools)。

    进入cmd命令窗口,检查SDK是不是安装成功。 
    运行 android –h 如果有类似以下的输出,表明安装成功:


    ADT插件安装:

    ADT是专门给eclipse开发android的插件

    • 打开 Eclipse IDE,进入菜单中的 "Help" -> "Install New Software"
    • 点击Add...按钮,弹出对话框要求输入Name和Location:Name自己随便取,Location输入http://dl-ssl.google.com/android/eclipse。如下图所示:


    确定返回后,在work with后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有Developer Tools,展开它会有Android DDMS和Android Development Tool,勾选他们。 如下图所示:



    然后就是按提示一步一步next。

    完成之后:

    • 选择Window > Preferences...
    • 在左边的面板选择Android,然后在右侧点击Browse...并选中SDK路径,本机为: 
      D:\AndroidDevelop\android-sdk-windows
    • 点击Apply、OK。配置完成。

    创建android AVD模拟器:

    android AVD模拟器是一个android的虚拟机用来在pc机上调试android程序用的!
    至于如何创建 这里就不说了 因为我使用真机调试所以没有用这个

    以上 android 的开发环境就搭建完毕了 如果有任何问题请自行google,这个资料太多了!
    总会有一个适合你

    NDK + Cygwin 环境搭建:

    安装Android NDK:

    1.下载Android NDK 我下载的是 r8版本 地址就不给除了 自己google吧
    2.解压到任意目录 我解压的目录是e:/IDE/ 下
    3.完成

    安装Cygwin:

    Cygwin 是一个将c++代码编译成os动态库的东西, 而os库就可以给java调用了
    这里可能你有疑惑 opencv for android 不是有java的API了么 怎么还要用c++
    嗯 只能说JAVA的API还不是很全面 有些东西还是会用到c++的API才行
    所以这个是必须的
    还有一些有说NDK r8 不需要Cygwin了 但是我不知道怎么弄 我目前还是使用这个的

    由于NDK开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要模拟Linux模拟编译环境,下载地址:

    http://www.cygwin.com/

    下载后是个setup.exe文件,使用过程如下:

    第一步:运行setup程序,第一步图略,直接点击Next进入下一步。

    第二步:选择安装方式,第一次可以采用Direct Connection在线下载安装,如有现成的离线包,可以选择离线安装(Install from Local Directory)。

    第四步:设置本地包暂存路径

    暂存目录默认是放到setup.exe的同级目录下,下载后名字类似ftp%3a%2f%2fcygwin.mirrors.pair.com%2f这样格式。


    第五步:设置网络连接方式


    第六步:选择下载站点地址

    起初尝试几个看哪个速度快就用哪个地址(如果感觉不快就点取消,再次来过)。



    第七步:等待加载安装项载入,选择安装项

    我们编译NDK,在默认设置下,只需选择Devel(点击列表中Devel,将后面的Default改为Install,图中箭头所示),其它均为默认状态。


    第八步:等待下载完成

    下载完成时间决定于你选择的安装包数量及网络连接速度,比如按照本文默认的选择方式,可能需要4-5个小时,下载后压缩包约750M,下载完成后会自动安装到上文设置的安装目录。



    提醒:第一次下载完成后,最好把下载的包目录做个备份,下次安装同样的环境可以直接使用离线安装方式(第二步中选择本地安装)。

    安装完成后,先运行Cygwin一次(Cygwin.bat),以便创建一些用户环境文件,分别输入:

    make -v

    和,

    gcc -v

    如果检测成功,会有make和gcc相关版本信息打印出来,如下图。




    可以在cygwin中通过vim修改,也可以在windows安装目录中修改 home\<你的用户名>\.bash_profile 文件中最后添加环境变量

    NDKROOT=/cygdrive/e/Andriod/develop/android-ndk-r8

    export NDKROOT

    其中NDK=/cygdrive/<你的盘符>/<android ndk 目录> ,"NDK"这个名字随便起,以后经常用不要太长。

    重启cygwin,输入:

    cd $NDK

    可进入ndk对应目录说明设置OK。

    3.用ls命令查看libs/armeabi/下是否生成了so文件,有libhello-jni.so说明ndk运行正常。
    $ ls libs/armeabi/
    gdb.setup gdbserver libhello-jni.so
    也可以到E:\android\android-ndk-r8\samples\hello-jni\libs\armeabi目录下看有没有生成的.so文件。


    2)导入NDK的hello-jni示例到Eclipse中
    1.在Eclipse中新建一个Android工程HelloJni。
    在Create Android Project时勾选“Create project from existing source”,Location中填E:\android\android-ndk-r8\samples\hello-jni





    2.直接以Android Aplication运行com.example.hellojni.HelloJni项目。要先有.so文件才能运行起来。 os放在工程根目录下


    CDT插件的安装:

    CDT是eclipse开发c++用的插件
    CDT插件可以在一个工程中同时开发基于C/C++的Native代码和基于Java的代码,加上Sequoyah插件可以一次编译两部分代码。下载地址:http://www.eclipse.org/cdt/downloads.php
    不同eclipse版本要下载对应的包,否则安装不了。
    Help-->About Eclipse 下可以看到自己用的版本,我的是 Version: Helios Service Release 2 即Helios版本
    http://www.eclipse.org/downloads/download.php?file=/tools/cdt/releases/helios/dist/cdt-master-7.0.2.zip
    cdt-master-7.0.2.zip:这个是CDT的离线安装包。(由于文件比较大推荐使用离线包,7.0.2的54.8M,8.1.1的103MB)
    安装:Eclipse -> Help -> Install New Software,点击add。
    Name:CDT_版本。
    Location:点击Archive,定位到下载的“cdt-master-7.0.2.zip”文件。

    如果Location的下面出现“Duplicate location”错误,请到Window -> preferences -> Install/Update -> Avaliable Software Site中找到remove掉。
    如果出现缺少eclipse包说明你下载的版本和eclipse版本不匹配,重新下载匹配的重新安装就可以了。


    另外需要重启eclipse后才生效。
    安装完成重启后,在Eclispe中新建一个项目,如果出现了C/C++项目,则表明CDT插件安装成功了。

    安装Sequoyah插件

    Sequoyah插件用于设置Android工程对Native开发的支持。
    官方网址:http://www.eclipse.org/sequoyah/downloads/
    打开上面网址就可以看到具体的安装说明了
    Location:http://download.eclipse.org/sequoyah/updates/2.0/

    For Helios SR2 Sequoyah version: http://download.eclipse.org/sequoyah/updates/1.0.2/
    注:只是安装1.0.2的没有出来“本机开发”的配置所以没法用,本人重新安装了2.0的可以了,这个应该直接安装最新版2.0的就可以了。
    在安装界面不要勾选“Group items by category”复选框,选中出现了列表为空(There are no categorized items)的情况。

    在“window –> preferences ->Android -> 本机开发”中添加NDK的路径。


    这个插件安装后也需要重启eclipse的
    重启后右键之前建立的“HelloJni”项目,在“Android Tools”选项中包含“Add Native Support…”选项即成功。

    opecnv for android 开发环境搭建:


    opencv for android SDK 安装:

    进入官网(http://opencv.org/)下载OpenCV4Android并解压,其目录结构如下:

    其中,sdk目录即是我们开发opencv所需要的类库;samples目录中存放着若干opencv应用示例(包括人脸检测等),可为我们进行android下的opencv开发提供参考;doc目录为opencv类库的使用说明及api文档等;而apk目录则存放着对应于各内核版本的OpenCV_2.4.3.2_Manager_2.4应用安装包。此应用用来管理手机设备中的opencv类库,在运行opencv应用之前,必须确保手机中已经安装了OpenCV_2.4.3.2_Manager_2.4_*.apk,否则opencv应用将会因为无法加载opencv类库而无法运行。

    2.2 将SDK引入工作空间

            (1) 选择一个路径,新建文件夹做为工作空间(我在E盘根目录下新建workspace目录来做为工作空间);

            (2) 将OpenCV-2.4.3.2-android-sdk中的sdk目录copy至工作空间,并将其更名为OpenCV-SDK(是否更改名称无所谓,这是我个人习惯而已);

            (3) 以新建的目录为工作空间,打开eclipse;

            (4) 将OpenCV-SDK引入到工作空间中,如下图所示:









    使用java API开发android:

    创建工程

            (1) 打开eclipse,创建android应用工程GrayProcess;

            (2) 将测试图像lena.jpg添加到资源目录res/drawable-hdpi中;

            (3) 在Package Explorer中选择项目GrayProcess,单击右键在弹出菜单中选择Properties,然后在弹出的Properties窗口中左侧选择Android,然后点击右下方的Add按钮,选择OpenCV Library 2.4.3并点击OK,操作完成后,会将OpenCV类库添加到GrayProcess的Android Dependencies中,如下图所示:








    工程代码:
    (1) 字符串资源文件:strings.xml
    <resources>
    
        <string name="app_name">GrayProcess</string>
        <string name="hello_world">Hello world!</string>
        <string name="menu_settings">Settings</string>
        <string name="title_activity_main">MainActivity</string>
        <string name="str_proc">gray process</string>
        <string name="str_desc">image description</string>
    
    </resources>
    (2) 布局文件:main.xml
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        
        <Button 
            android:id="@+id/btn_gray_process"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/str_proc"/>
        
        <ImageView
            android:id="@+id/image_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@string/str_proc"/>
    
    </LinearLayout>

      (3) MainActivity.java
    package com.iron.grayprocess;
    
    import org.opencv.android.BaseLoaderCallback;
    import org.opencv.android.LoaderCallbackInterface;
    import org.opencv.android.OpenCVLoader;
    import org.opencv.android.Utils;
    import org.opencv.core.Mat;
    import org.opencv.imgproc.Imgproc;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Bitmap.Config;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity implements OnClickListener{
    
    	private Button btnProc;
    	private ImageView imageView;
    	private Bitmap bmp;
    	
    	//OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作
    	private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
            @Override
            public void onManagerConnected(int status) {
                switch (status) {
                    case LoaderCallbackInterface.SUCCESS:{
                    } break;
                    default:{
                        super.onManagerConnected(status);
                    } break;
                }
            }
        };
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            btnProc = (Button) findViewById(R.id.btn_gray_process);
            imageView = (ImageView) findViewById(R.id.image_view);
            //将lena图像加载程序中并进行显示
            bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);
            imageView.setImageBitmap(bmp);
            btnProc.setOnClickListener(this);
        }
    
    	@Override
    	public void onClick(View v) {
    		Mat rgbMat = new Mat();
    		Mat grayMat = new Mat();
    		//获取lena彩色图像所对应的像素数据
    		Utils.bitmapToMat(bmp, rgbMat);
    		//将彩色图像数据转换为灰度图像数据并存储到grayMat中
    		Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);
    		//创建一个灰度图像
    		Bitmap grayBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.RGB_565);
    		//将矩阵grayMat转换为灰度图像
    		Utils.matToBitmap(grayMat, grayBmp);
    		imageView.setImageBitmap(grayBmp);
    	}
    	
    	@Override
        public void onResume(){
            super.onResume();
            //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是
            //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
        }
    }
    

    3.1.3 运行结果
           


    使用 c++ API开发android:

    创建工程       

            步骤如工程一,创建新工程GrayProcess2,将lena.jpg添加到资源文件,并按上面所示将opencv类库添加到工程中。

    编写上层代码(java)

    (1)Stings.xml

    <resources>
        <string name="app_name">GrayProcess2</string>
        <string name="hello_world">Hello world!</string>
        <string name="menu_settings">Settings</string>
        <string name="title_activity_main">GrayProcess2</string>
        <string name="str_proc">gray process</string>
        <string name="str_desc">image description</string>
    </resources>
    (2)main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        
        <Button 
            android:id="@+id/btn_gray_process"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/str_proc"/>
        
        <ImageView
            android:id="@+id/image_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@string/str_proc"/>
    
    </LinearLayout>

    (3)MainActivity.java

    package com.iron.grayprocess2;
    
    import org.opencv.android.BaseLoaderCallback;
    import org.opencv.android.LoaderCallbackInterface;
    import org.opencv.android.OpenCVLoader;
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Bitmap.Config;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity implements OnClickListener{
    
        private Button btnProc;
        private ImageView imageView;
        private Bitmap bmp;
    	
        //OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作
         private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
            @Override
            public void onManagerConnected(int status) {
                switch (status) {
                    case LoaderCallbackInterface.SUCCESS:{
                    	System.loadLibrary("image_proc");
                    } break;
                    default:{
                        super.onManagerConnected(status);
                    } break;
                }
            }
        };
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            btnProc = (Button) findViewById(R.id.btn_gray_process);
            imageView = (ImageView) findViewById(R.id.image_view);
            //将lena图像加载程序中并进行显示
             bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);
            imageView.setImageBitmap(bmp);
            btnProc.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
    		 
            int w = bmp.getWidth();
            int h = bmp.getHeight();
            int[] pixels = new int[w*h];	 
            bmp.getPixels(pixels, 0, w, 0, 0, w, h);
            int[] resultInt = ImageProc.grayProc(pixels, w, h);
            Bitmap resultImg = Bitmap.createBitmap(w, h, Config.ARGB_8888);
            resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
            imageView.setImageBitmap(resultImg);	
        }
    	
        @Override
        public void onResume(){
            super.onResume();
            //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是
            //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
        }
    }
    

     代码第28行:System.loadLibrary("image_proc")用来当OpenCV类库初始化完成后加载类库image_proc。此类库由我们来生成,用于完成图像灰度处理的操作,此部分将在下面中说明。


      (4) ImageProc.java

    package com.iron.grayprocess2;
    
    public class ImageProc {
    	public static native int[] grayProc(int[] pixels, int w, int h);
    }


     ImageProc.java中只定义了方法grayProc,关键字native表明,此方法的实现由本地代码(C/C++)来完成。


    编写JNI及C相关代码

            在项目中新建目录jni,在jni目录中分别添加文件Android.mk,Application.mk,ImageProc.h,ImageProc.cpp,这四个文件的内容分别如下所示。

            (1) Android.mk

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    include ../OpenCV-SDK/native/jni/OpenCV.mk
    LOCAL_SRC_FILES  := ImageProc.cpp
    LOCAL_MODULE     := image_proc
    include $(BUILD_SHARED_LIBRARY)

    代码说明:

    第一行:指明当前编译路径;

    第二行:清空变量;

    第三行:将OpenCV类库中的编译文件包含进来,如此一来在我们的工程中即可使用OpenCV类库;

    第四行:指定需要编译的C++源文件;

    第五行:指定编译生成的类库名称;

    第六行:调用命令将源文件编译为静态库。

    注:第三行指定的路径很关键,当opencv类库与工程路径相关位置发生改变时,此路径也要随之改变。


    (2) Application.mk(配置文件)

    APP_STL := gnustl_static
    APP_CPPFLAGS := -frtti -fexceptions
    APP_ABI := armeabi-v7a
    APP_PLATFORM := android-8
    


    (3)ImageProc.cpp

    #include <ImageProc.h>
    #include <opencv2/core/core.hpp>
    #include <string>
    #include <vector>
    
    using namespace cv;
    using namespace std;
    
    JNIEXPORT jintArray JNICALL Java_com_iron_grayprocess2_ImageProc_grayProc(JNIEnv* env, jclass obj, jintArray buf, jint w, jint h){
    	jint *cbuf;
    	cbuf = env->GetIntArrayElements(buf, false);
    	if(cbuf == NULL){
    		return 0;
    	}
    
    	Mat imgData(h, w, CV_8UC4, (unsigned char*)cbuf);
    
    	uchar* ptr = imgData.ptr(0);
    	for(int i = 0; i < w*h; i ++){
    		//计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B
    		//对于一个int四字节,其彩色值存储方式为:BGRA
    		int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);
    		ptr[4*i+1] = grayScale;
    		ptr[4*i+2] = grayScale;
    		ptr[4*i+0] = grayScale;
    	}
    
    	int size=w * h;
    	jintArray result = env->NewIntArray(size);
    	env->SetIntArrayRegion(result, 0, size, cbuf);
    	env->ReleaseIntArrayElements(buf, cbuf, 0);
    	return result;
    }


    说明:

    •         ImageProc.h头文件可以通过jdk提供的工具javah来生成,具体生成方法在下面
    •         JNI中的定义的函数遵循一定的命名规则:Java_包名_类名_方法名,具体参考JNI编程相关知识;
    •         ImageProc.cpp中利用彩色值转换为灰度值的计算公式,将lena.jpg图像的每个像素转换为灰度值,并返回给应用层。需要注意的是对于ARGB_8888类型的图像而言,其每一个像素值在int型数据中的存储序列为BGRA。
      还需要注ImageProc.cpp 这个文件 第10行的函数名称Java_包名_类名_方法名 请修改成.h 文件生成的那个函数名 
    生成.h 文件


    1.首先当年写完ImageProc.java 这个保存 以后 eclipse会自动帮你生成 java 的class文件

       你可以再工程目录--》 bin --》classes -》com -------。。。。。 的文件里找到

       比如我的 在E:\work\op\OpenCV-2.4.5-android-sdk\samples\Test2\bin\classes\com\test2\test2 这个路径下

    如图


    2.将classes文件拷贝到e盘根目录下

    然后打开 cmd 

    e:

    cd classes

    javah com.test2.test2.ImageProc

    然后就会在classes文件里找到一个 xxx.的头文件 如图


    你可以将这个头文件改成任意名字 比如我们上面的ImageProc.h 然后放入工程目录的jni中


    编译运行方法有两种

    1 配置eclipse自动运行

    第一步:转换工程。点击“文件 -> 新建 -> 其他”(快捷键:Ctrl+N)。选择“C/C++”下的“Convert to a C/C++ Project(Adds C/C++ Nature)”。进 入“下一步”。


    第二步:选中你刚才建的“HelloJni”工程,下面左边选“Makefile project”右边选“Cygwin GCC”。确定后提示的“透视图”不清楚是什么,点击“是”即可。

    第三步:在“HelloJni”工程上右键,选择“属性”。配置“C/C++ Build”和“C/C++ General -> Paths and Symbols”。

    C/C++ Build:点击“C/C++ Build”,在右边的“Builder Settings”中去掉默认勾选的“Use default build command”复选框。设置Build command为“
    ${NDKROOT}/ndk-build.cmd "


    C/C++ General -> Paths and Symbols:在Includes下add新的GNU C依赖路径。此“HelloJni”工程需要“D:\Java\android-ndk-r8\platforms\android-8\arch-arm\usr\include”即可,以后根据不同项目选择不同的依赖库。


    这里只要是你cpp文件里头文件包含目录

    你可以直接在NDK 和opencv jni那个目录下搜索头文件名 然后看看在那个路径有

    配置好后运行就行了


    2.手动使用Cygwin 生成os 然后运行

     由于程序中涉及到了JNI编程,因此需要用cygwin对其中的C/C++代码进行编译。打开cygwin,进入到工程的根目录中执行命令:$NDKROOT/ndk-build完成相关编译;之后在eclipse中刷新工程GrayProcess2,运行即可。编译及运行结果分别如下所示。


        



    到这里两种方法都结束了!


    有问题请留言

    或者kael@puwenhui.com

    有空会及时回复的






    展开全文
  • 主题:Android教程之Android自带的语音识别例子初探 版权申明:http://yarin.javaeye.com/blog/453262 语音识别技术是在Android SDK1.5中才加入的(RecognizerIntent),这里我们简单的分析一下自带的api例子,...
  • 大疆文档(5)-Android教程-使用UX SDK

    千次阅读 热门讨论 2019-04-10 09:49:32
    在本教程中,您将学习如何使用DJI Android UX SDK和DJI Android SDK轻松创建功能齐全的mini-DJI Go app,具有标准的DJI Go UI和功能。在本教程结束时,您将拥有一个可用于显示相机FPV视图,检查飞机状态,拍摄照片,...
  • 问题:在进行基本的Android基本应用开发之前,要... 本教程从零开始在Android Studio中设置项目,并在FrameLayout中嵌入一个WorldWind球体 创建一个新的Android工程项目1. 基本的APP就设置好了。 2.我们要进
  • Android Studio找不到连接的手机完全解决办法 1、问题背景 现在Android大多都用谷歌的Android Studio来开发 但是 一开始使用Android Studio都不会那么顺利 总要踩坑 其中踩得最多的坑就是 Android Studio里找不到...
  • 贡献15本超级经典Android教程,都是pdf完整版的 Android开发编程从入门到精通——Android程序员必备   点击下载 Android应用程序开发36技(pdf完整版359页)   点击下载 Android新手...
  • 详细Fildder抓包Android教程

    千次阅读 2018-07-24 16:55:37
    一部Android手机 一台Windows电脑 零、写在前面 Fiddler是什么 摘自百度百科 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”...
  • 下载地址:OpenCV330-Android-SDK 解压下载完的压缩包 打开 Android Studio 创建一个空白的安卓项目 然后点击next->Finnish .然后就终于完成这个烦死人的导包了 现在可以写代码了...
  • android系统在启动一个应用组件前,它需要知道这个这个组件的存在。你的应用必须在清单文件(AndroidManifest.xml)中声明它所有的组件,并且清单文件必须放在应用工程的根目录。 清单文件做下列事情,例如: ...
  • ActionBar 简介视频为本篇播客知识点讲解,建议...Android 3.0 Android 推了 ActionBar 这个控件,而到了2013 年 Google 开始大力地推动所谓的 android style,想要逐渐改善过去 android 纷乱的界面设计,希望让终端使用
  • 本节全篇为大疆 Mobile SDK 安卓教程 部分,ios教程参见 IOS教程 . 应用程序激活和飞机绑定 Note:本教程仅适用于在 中国 使用的应用程序。相同的步骤可用于在现有应用中激活应用和绑定飞机。 你可以在这里下载本...
  • H builder项目Dcloud离线打包Android教程(一)

    万次阅读 热门讨论 2016-11-16 18:41:50
    app开发发展的越来越迅速,从原生开发到react native,再到基于h5+的H builder开发。官网上的离线打包教程看起来挺乱的,...eclipse,Android开发环境,或者直接下集成版的android studio(不会的百度= =) 下载离线打包
  • 版权申明:http://yarin.javaeye.com/blog/453262 1:列出模拟器类型 android list targets2:建立模拟器android create avd --target 2 --name cupcake (cupcake)为新建模拟器的名字3:列出自己建立的么模拟器...
  • OpenCV-Android教程-引言(先看这里)

    千次阅读 2020-01-18 20:10:08
    OpenCV同时也支持Android平台 学习过安卓的也知道 安卓是用Java写的 所以推荐大家学习安卓的OpenCV的时候 要先学Java版的 因为安卓很麻烦,不管是显示图片 还是调试 都是很慢的 而且这里安卓的Api和Java的Api是一样...
  • Android教程-从零开始一步一步接入SDK

    万次阅读 多人点赞 2014-08-29 00:28:10
    从零开始一步一步接入SDK

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,088
精华内容 14,435
关键字:

android教程