-
android 拍照
2018-10-27 13:05:22android 拍照 一、布局:使用RecyclerView横向滑动显示。 二、拍照、系统适配 1、动态判断权限 2、FileProvider适配 <provider android:name="a...android 拍照
- 一、布局:使用RecyclerView横向滑动显示。
- 二、拍照、系统适配
- 1、动态判断权限
- 2、FileProvider适配
-
<provider android:name="android.support.v4.content.FileProvider" android:authorities="包名.FileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/rc_file_path" /> </provider>
xml文件
-
<?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="test" path="Android/data/com/test" /> <external-path name="external_storage_root" path="." /> </paths>
自定义path路径
-
3、拍照
private void startDeviceCamera() { Intent mIntent = new Intent(); mIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); setSavePath(); deviceFile = new File(saveFile, System.currentTimeMillis() + ".jpg"); Uri uri = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkPermission()) { requestPermission(); } else { mIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(this, "包名.FileProvider", deviceFile); } else { uri = Uri.fromFile(deviceFile); } } } else { //6.0以下直接转换Uri uri = Uri.fromFile(deviceFile); } mIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(mIntent, 101); } private void setSavePath() { saveFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test"); // 自定义路径 if (!saveFile.exists()) { saveFile.mkdirs(); } }
三、设置数据
Bean类 声明图片为Object类型
private Object imgPath;
向List添加数据
AuthDeviceBean deviceBean = new AuthDeviceBean(); deviceBean.setImgPath(R.mipmap.ic_apply_add); authDeviceList.add(deviceBean);
为Adapter设置点击事件
authDeviceAdapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { if (position == authDeviceList.size() - 1) { startDeviceCamera(); } } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == 101) { if (deviceFile.exists() && deviceFile.isFile()) { String imgPath = deviceFile.getAbsolutePath(); AuthDeviceBean authDeviceBean = new AuthDeviceBean(); authDeviceBean.setImgPath(imgPath); authDeviceList.add(authDeviceList.size(), authDeviceBean); authDeviceAdapter.notifyDataSetChanged(); } } } }
四、问题
此时,连续拍照功能初步完成。运行发现,2个问题。
问题1:拍第1张照片后,“+”号显示在照片前面。
解决:onActivityResult() 方法中,向List添加数据
authDeviceList.add(authDeviceList.size(), authDeviceBean); // 改为 authDeviceList.add(authDeviceList.size() - 1, authDeviceBean); //注:通过add()方法,List长度减去1解决。
问题2:未限制拍照个数。
解决:adapter 点击事件中,进行判断。
if (position == authDeviceList.size() - 1) { startDeviceCamera(); } // 例如:连续拍3张。通过List下标处理。 if (position == authDeviceList.size() - 1) { if (authDeviceList.size() <= 3) { startDeviceCamera(); } else { Toast.makeText(mContext, "最多3张", Toast.LENGTH_SHORT).show(); } }
连续拍照功能完成。
-
Android拍照
2014-03-24 21:27:34<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_p<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/btn" android:src="@drawable/ic_launcher" > </ImageView> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="点击拍照" android:textSize="15pt" /> </RelativeLayout>
XML文件如上图所示:Java程序
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.btn); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 Log.v("TestFile", "SD card is not avaiable/writeable right now."); return; } Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式 FileOutputStream b = null; File file = new File("/sdcard/myImage/"); file.mkdirs();// 创建文件夹 String fileName = "/sdcard/myImage/111.jpg"; try { b = new FileOutputStream(fileName); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件 } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { b.flush(); b.close(); } catch (IOException e) { e.printStackTrace(); } } ((ImageView) findViewById(R.id.image)).setImageBitmap(bitmap);// 将图片显示在ImageView里 } } }
Mainfest.xml中增加两个标签如下所示:(权限很重要)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
-
android拍照
2012-11-16 15:04:07拍照可以调用系统的相机进行拍照,拍完保存到相应的SD卡目录。最近要用到拍照这个功能,首先试了下调用相机拍照,保存到相应目录,然后用imageview显示的时候感觉,很模糊。可能是图片被压缩的太狠了。所以自己使用...拍照可以调用系统的相机进行拍照,拍完保存到相应的SD卡目录。最近要用到拍照这个功能,首先试了下调用相机拍照,保存到相应目录,然后用imageview显示的时候感觉,很模糊。可能是图片被压缩的太狠了。所以自己使用Camera写了一个拍照的功能,拍出来的还挺清晰的,不过文件有点大一张图片差不多1.7M。如果想拍高清图可以使用下面的代码。
代码很简单,我就不做过多解释了。
package com.example.testsimple; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Date; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.hardware.Camera; import android.text.format.DateFormat; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends Activity { private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private Camera camera; private File picture; private Button btnSave; private final static String TAG = "CameraActivity"; private ImageView open_picIcon; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* Intent intent=new Intent(MainActivity.this,MyCameraActivity.class); startActivity(intent); finish();*/ setupViews(); } private void setupViews(){ surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); btnSave = (Button) findViewById(R.id.save_pic); open_picIcon=(ImageView) findViewById(R.id.open_picIcon); btnSave.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { surfaceView.setVisibility(View.VISIBLE); open_picIcon.setVisibility(View.GONE); takePic(); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_CAMERA || keyCode == KeyEvent.KEYCODE_SEARCH) { takePic(); return true; } return super.onKeyDown(keyCode, event); } private void takePic() { camera.stopPreview();// stop the preview camera.takePicture(null, null, pictureCallback); // picture } // Photo call back Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { //@Override public void onPictureTaken(byte[] data, Camera camera) { new SavePictureTask().execute(data); camera.startPreview(); } }; // save pic class SavePictureTask extends AsyncTask<byte[], String, String> { @Override protected String doInBackground(byte[]... params) { String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg"; Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory()); //picture = new File(Environment.getExternalStorageDirectory(),fname);// create file picture = new File(Environment.getExternalStorageDirectory()+"/images/"+fname); File file= picture.getParentFile(); if(!file.exists()) file.mkdir(); try { FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream fos.write(params[0]); // Written to the file fos.close(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); Bitmap bitmap=getDiskBitmap(picture.getPath()); surfaceView.setVisibility(View.GONE); open_picIcon.setVisibility(View.VISIBLE); open_picIcon.setImageBitmap(bitmap); } } private Bitmap getDiskBitmap(String pathString) { Bitmap bitmap = null; try { File file = new File(pathString); if(file.exists()) { bitmap = BitmapFactory.decodeFile(pathString); } } catch (Exception e) { // TODO: handle exception } return bitmap; } // SurfaceHodler Callback handle to open the camera, off camera and photo size changes SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { public void surfaceCreated(SurfaceHolder holder) { Log.i(TAG, "surfaceCallback===="); camera = Camera.open(); // Turn on the camera try { camera.setPreviewDisplay(holder); // Set Preview } catch (IOException e) { camera.release();// release camera camera = null; } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i(TAG,"====surfaceChanged"); Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format // parameters.set("rotation", 180); // Arbitrary rotation camera.setDisplayOrientation(0); parameters.setPreviewSize(400, 300); // Set Photo Size camera.setParameters(parameters); // Setting camera parameters camera.startPreview(); // Start Preview } public void surfaceDestroyed(SurfaceHolder holder) { Log.i(TAG,"====surfaceDestroyed"); camera.stopPreview();// stop preview camera.release(); // Release camera resources camera = null; } }; }
拍完以后自动保存到SD卡中的images目录下下面是图片存放路径
1.8M 确实有点大,不过是高清图片 ,哈哈。
-
Android拍照,连拍以及自动拍照
2016-12-05 10:07:18Android拍照,连拍以及自动拍照 -
Android 拍照上传功能控件
2015-04-10 17:45:46Android 拍照上传功能控件 兼容2.3以上 -
android拍照源代码
2010-12-04 12:32:20android 拍照 源代码,内容比较多,大家可以好好参考一下。 -
Android 拍照功能详解
2017-09-05 14:34:47Android拍照功能相信都不陌生。这篇文章总结下Android拍照功能的具体知识。 分两种场景: 场景一,拍照然后显示照片在页面; 场景二,拍照然后将照片以文件方式存储。 简单的拍照功能原理:调用系统的Camera应用生成...Android拍照功能相信都不陌生。这篇文章总结下Android拍照功能的具体知识。
分两种场景:
- 场景一,拍照然后显示照片在页面;
- 场景二,拍照然后将照片以文件方式存储。
简单的拍照功能
原理:调用系统的Camera应用生成一张照片
1.要求系统支持拍照功能
<manifest ... > <uses-feature android:name="android.hardware.camera" android:required="true" /> ... </manifest>
在AndroidManifest.xml中注册相机权限,这样在支持拍照功能的手机上允许安装应用。如果手机系统不支持拍照功能,则不允许安装应用程序。
2.使用Camera App拍照
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } }
方法中用到一个resolveActivity(),该方法返回intent可以操作的第一个Activity。使用该方法可以防止Intent启动过程出现空指针异常
3.处理缩略图
Camera应用程序将照片作为小的位图发送到onActivityResult()的Intent中,key值为data。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQUEST_IMAGE_CAPTURE){ Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data"); mImageView.setImageBitmap(bitmap); } }
上面介绍了使用Android系统的Camera应用生成一个缩略图,如果我们希望获取完整的拍照图片,我们需要以File的形式来存储拍摄照片。
保存完整的拍照图片
保存拍照图片为完整的文件,关键是得到图片的Uri,然后用Intent调起拍照的时候将文件的Uri放入MediaStore.EXTRA_OUTPUT参数中。
1.首先添加文件的写入权限
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>
2.创建文件目录
String mCurrentPhotoPath; private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents mCurrentPhotoPath = image.getAbsolutePath(); return image; }
getExternalFilesDir(Environment.DIRECTORY_PICTURES)方法获取到的文件目录是在:
Android/data/包名/files/Pictures
当然,你可以将图片放到任何位置,比如SDCard中、Public目录中等等。该方法可以作为一个文件目录创建的参考。
3.拍照操作
static final int REQUEST_TAKE_PHOTO = 2; private void dispatchTakePictureFileIntent() { Uri photoURI; Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { File photoFile = null; try { photoFile = createImageFile(); if (photoFile != null) { //根据不同的系统版本处理文件目录访问的方式 if(Build.VERSION.SDK_INT >= 24){ photoURI = FileProvider.getUriForFile(this, "com.camerademo.fileprovider", photoFile); }else { photoURI = Uri.fromFile(photoFile); } takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); } } catch (IOException e) { e.printStackTrace(); } } }
因为Android7.0以后改变了文件的Uri操作方式。Android7.0需要通过FileProvider来获取文件的Uri路径。
Android7.0及以上获取到的Uri为:file:// URI Android7.0以前获取到的Uri为:content:// URI
FileProvider配置
因此,我们需要在AndroidMainfest.xml里面指定我们的FileProvider:
<application> ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.camerademo.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data> </provider> ... </application>
注意:这里的authorities就是上面代码FileProvider.getUriForFile()中的对应的名称。resource下面的file_paths是在values->xml目录下的file_paths文件
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="Android/data/com.camerademo/files/Pictures" /> </paths>
这里可以指定path的目录,也可以将path目录滞空。
图片压缩
使用相机拍照生成的照片往往好几兆,当我们显示在页面上的时候根本不需要显示像素这么高的图片,不仅会增大我们应用的内存消耗,有时候甚至会导致应用内存泄漏,因此在显示照片的时候我们都要做图片的压缩处理。
private void setPic() { // Get the dimensions of the View int targetW = mImageView.getWidth(); int targetH = mImageView.getHeight(); // Get the dimensions of the bitmap BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; Log.e("wj","压缩前的图片宽高:" + photoW + "*" + photoH); // Determine how much to scale down the image int scaleFactor = Math.min(photoW/targetW, photoH/targetH); // Decode the image file into a Bitmap sized to fill the View bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; bmOptions.inPurgeable = true; Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); Log.e("wj","压缩后的图片宽高:" + bmOptions.outWidth + "*" + bmOptions.outHeight); mImageView.setImageBitmap(bitmap); }
我们看下图片在处理前和处理后,大小区别
09-05 14:20:49.972 18911-18911/com.camerademo E/wj: 压缩前的图片宽高:1840*3264 09-05 14:20:50.192 18911-18911/com.camerademo E/wj: 压缩后的图片宽高:460*816
图片压缩也是我们常用方法之一。该方法可以当做图片压缩的一个处理的参考。
至此拍照功能介绍结束。
最后我们考虑这样一个问题,我们在上面存储拍照后的图片使用的文件路径是getExternalFilesDir(),该路径只能在我们应用内访问,系统不会将该图片添加到系统的Media Provider中,也就是说我们无法在其他应用中通过Media Scanner功能发现该照片。
要想让其他应用可以通过媒体搜索发现我们拍照生成照片,我们需要发送一个系统广播,通知系统将我们的照片路径下的照片文件添加到系统的Media Provider 的database中。private void galleryAddPic() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(mCurrentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); }
欢迎大家留言交流。
-
Android 拍照上传和拍照本地显示,拍照剪切上传,选取本地图片剪切上传
2014-12-24 10:20:33Android 拍照上传和拍照本地显示,拍照剪切上传,选取本地图片剪切上传 -
android拍照例子
2011-09-05 18:20:45android拍照例子 -
android 拍照加时间水印(以及图片)
2017-06-20 13:07:18android 拍照加时间水印(以及图片)demo,含详细注解 -
Android 拍照和相册选择
2016-08-10 17:11:09Android 拍照和相册选择 -
Android拍照识别车牌号SDK
2016-12-05 08:39:36Android拍照识别车牌号SDK Android拍照识别车牌号技术描述 Android拍照识别车牌号是我公司开发的基于移动平台的车牌识别软件开发包,支持android、ios等多种主流移动操作系统。该产品采用手机、平板电脑摄像头... -
android拍照后将照片上传服务器的例子
2013-05-25 08:56:04android拍照后将照片上传至web服务器,服务器端使用servlet+tomcat实现,拍照时实现自动对焦,并且可以调整相机焦距 -
Android拍照识别身份证SDK
2016-12-04 09:24:50Android拍照识别身份证SDK 一、Android拍照识别身份证应用背景 这些年,随着互联网金融的极速发展,第三方支付、理财、P2P网贷、征信等APP应用成爆发式的增长,在众多APP中都涉及到对身份证信息的录入,如第三... -
Android拍照、相册选取、截图综合Demo
2013-03-10 16:08:36实现Android相机拍照、相册选取后直接显示以及截图后显示,解决因Bitmap导致的内存溢出问题。 -
android 拍照图片旋转问题
2013-11-05 10:27:51android拍照后图片旋转问题 -
android拍照获取图片
2015-01-09 13:42:071.就自己研究写一下android拍照获取图片,自己主要试了两种方法。 1).当不指定图片保存路径时。系统返回的时缩略图。 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ... -
Android拍照或从系统相册获取图片
2016-08-21 14:01:27android拍照,android从系统相册选择照片,android获取图片,android调用相机 -
android 拍照或从本地相册多次添加多张图片
2014-10-21 14:17:34自己写的android 拍照或从本地相册多次添加多张图片亲测可用 -
android 拍照+裁剪(解决部分相机拍照角度问题)
2016-07-06 11:33:22android 拍照+裁剪(解决部分相机拍照角度旋转问题) 最近有人问拍照、裁剪、相片角度问题,网上的坑太多,于是自己来填一下。 废话不多说,直接上代码 相关权限 android:name="android.permission.... -
Android 拍照7.0适配(源码)
2018-04-23 10:56:25Android 拍照7.0适配(源码) 从Android 7.0开始,一个应用提供自身文件给其它应用使用时,如果给出一个file://格式的URI的话,应用会抛出FileUriExposedException。 解决方法:FileProvider方式 源码(没封装... -
android 拍照的图片保存到系统图库
2016-12-09 20:55:08android 拍照的图片保存到系统图库 -
Android拍照实现方式概述
2012-08-09 14:24:19Android拍照的实现方法在这里总共介绍了两种。我们可以通过几段代码的解读,来对这些方法进行一个详细的了解。 AD: 51CTO云计算架构师峰会 抢票进行中! 编程人员在Android手机操作系统中可以... -
你需要知道的Android拍照适配方案
2016-06-23 13:52:23你需要知道的Android拍照适配方案 -
android 拍照的简单实现
2013-04-08 15:42:23使用android拍照,实现起来比较简单,直接调用手机内置的摄像头。调用代码android的demo程序中已经给出。我在上面稍微做了些修改。下面我们看下具体代码。 源代码见:... -
android 拍照上传照片
2016-02-29 10:00:11android ,Activity S需要拍照上传照片,但是点用相机后,S会刷新界面,怎么破? Activity S的属性是: android:name="com.example.activity.S" android:screenOrientation="portrait" android:... -
Android 拍照和选择图库的demo(兼容7.0)
2017-11-20 21:20:52Android 拍照和选择图库的demo(兼容7.0) -
Android 拍照和图库功能(适配Android 6.0和7.0系统和华为机型问题)
2017-11-13 09:37:03android 拍照和图库功能,适配6.0权限,7.0FileProvider,华为图库获取不到图片的问题,部分机型图片旋转,内存被回收等问题。 -
Android拍照扫描识别身份证信息SDK
2017-04-23 10:31:22Android拍照扫描识别身份证信息SDK 移动互联网是大趋势? 随着智能手机的硬件不断优化,移动互联网及应用大范围普及,互联网+各行各业,跨界、融合、创新,市场瞬息万变,有野心的企业和人、技术都在拼命的赶...