在上一篇博客中我们已经讲解了喜马拉雅开发前的配置,上一张有一个点没有提,在这在补充一下,喜马拉雅申请key 的时候需要签名就是你的SHA1 的值,不知道怎么获取SHA1的值的小伙伴们,可以去其他博客上看下,我就不详细的讲解了,现在我们来进入我们的正文实现喜玛拉雅的功能。

首先上一张效果图给大家看下

上面是我们這个项目要实现后的图,首先我们来分析下布局,上面是一个可以滑动的类别布局,类别下面是展示类别后的标签类,点击标签后在出现图二,点击图二的条目,我们开始播放这个条目。

由于在代码上注释的很清楚,我就直接把代码放上去了,不懂的地方参照下注释理解下就懂了,

MainActivity.class

package com.testopensourceapplication.tingproject;import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;import com.ximalaya.ting.android.opensdk.constants.DTransferConstants;
import com.ximalaya.ting.android.opensdk.datatrasfer.CommonRequest;
import com.ximalaya.ting.android.opensdk.datatrasfer.IDataCallBack;
import com.ximalaya.ting.android.opensdk.model.PlayableModel;
import com.ximalaya.ting.android.opensdk.model.album.AlbumList;
import com.ximalaya.ting.android.opensdk.model.category.Category;
import com.ximalaya.ting.android.opensdk.model.category.CategoryList;
import com.ximalaya.ting.android.opensdk.model.live.radio.Radio;
import com.ximalaya.ting.android.opensdk.model.tag.Tag;
import com.ximalaya.ting.android.opensdk.model.tag.TagList;
import com.ximalaya.ting.android.opensdk.model.track.Track;
import com.ximalaya.ting.android.opensdk.model.track.TrackList;
import com.ximalaya.ting.android.opensdk.player.XmPlayerManager;
import com.ximalaya.ting.android.opensdk.player.service.IXmPlayerStatusListener;
import com.ximalaya.ting.android.opensdk.player.service.XmPlayerException;import net.tsz.afinal.FinalBitmap;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MainActivity extends AppCompatActivity {public String TAG ="MainActivity";public HorizontalScrollView ting_header;private CommonRequest mXimalaya;private String mAppSecret = "c4fce2b85e8f354e071904eb8f595795";private XmPlayerManager mPlayerManager;private boolean mOnDmandLoading = false;//是否加载点播模块
    private int mPageId = 1;private int index = 0;private AlbumList mAlbumList;//标签下的专辑列表
    private Category mCategory = null;//点播类别
    FinalBitmap mFinalBitmap;/**
     * 更改textview状态
     */
    List<TextView> textViews = new ArrayList<TextView>();LinearLayout ting_choose;   //动态生成的存放类别的布局
    GridView mTagGridView;   //类别下的标签展示列表
    ListView mTingTrackListView;    //  标签后的listView展示布局


    private List<Category> mCategoryList = new ArrayList<Category>();//类别列表  有声书 、音乐、娱乐。。。。。

    private List<Tag> mTagList = new ArrayList<Tag>();//类别下的标签列表    悬疑、 言情  幻想  等

    private List<Track> mTrackList = new ArrayList<Track>();//标签后   专辑下的声音列表


    private TingTagAdapter mTingTagAdapter;//类别列表后的 标签适配器
     private TingTracksAdapter mTingTrackAdapter;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();initView();CategoryData();}//初始化喜马拉雅
    public void initData(){mFinalBitmap = FinalBitmap.create(MainActivity.this);mFinalBitmap.configLoadfailImage(R.drawable.ting_default_icon);mFinalBitmap.configLoadingImage(R.drawable.ting_default_icon);mXimalaya = CommonRequest.getInstanse();mXimalaya.init(MainActivity.this, mAppSecret);mXimalaya.setDefaultPagesize(50);mPlayerManager = XmPlayerManager.getInstance(this);mPlayerManager.init();mPlayerManager.addPlayerStatusListener(mPlayerStatusListener);}//初始化控件
    public void initView(){ting_header = (HorizontalScrollView) findViewById(R.id.ting_header);ting_choose = (LinearLayout) findViewById(R.id.ting_choose);    //存放分类的布局
        mTagGridView = (GridView) findViewById(R.id.gv_tag_list);    //类别下的展示列表
        mTingTrackListView = (ListView) findViewById(R.id.gv_category_item_list);mTingTagAdapter = new TingTagAdapter(mTagList, MainActivity.this);mTagGridView.setAdapter(mTingTagAdapter);//设置类别声音适配器
        mTingTrackAdapter = new TingTracksAdapter(mTrackList, MainActivity.this, mFinalBitmap, mPlayerManager);mTingTrackListView.setAdapter(mTingTrackAdapter);}//点击事件
    public void CategoryData(){loadOnDamendCategory();//标签的点击事件  //如点击  悬疑  言情  之类的
        //点击标签时掩藏  头部(分类的布局),标签的布局展示 标签下的listViwe 的布局
        mTagGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {Tag mTag = mTagList.get(position);mTagGridView.setVisibility(View.GONE);   //掩藏  标签的布局
                mTingTrackListView.setVisibility(View.VISIBLE);ting_header.setVisibility(View.GONE);//获取点击标签时  当前点击的标签  下面的listView 的数据
                getAlbums((int) mCategory.getId(), mTag.getTagName());}});mTingTrackListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {Log.e(TAG, "时长:" + mPlayerManager.getDuration() + "DDDDDDDDDDDDDDDDD");Log.e(TAG, "是否在播放:" + mPlayerManager.isPlaying() + "DDDDDDDDDDDDDDDDD");Log.e(TAG, "点击mTingTrackListView:" + position + "--------------------------"+mTrackList.toString());index = position;mPlayerManager.playList(mTrackList, position);  //此方法用来播放普通声音列表: list :声音列表    startIndex:播放index指定处的声音

                TingApplication.isTingPlaying = true;TingApplication.tingOrMusic = "ting";/*       Intent intent =new Intent(MainActivity.this,PlayActivity.class);
                startActivity(intent);*/
                //mPlayerManager.play();
            }});}//加载点播列表
    public void loadOnDamendCategory(){if (mOnDmandLoading) {return;}mOnDmandLoading = true;//获取喜马拉雅内容分类  接口
        Map<String,String>  map =new HashMap<String,String>();CommonRequest.getCategories(map, new IDataCallBack<CategoryList>() {@Override
            public void onSuccess(CategoryList object) {if (object != null && object.getCategories() != null) {mCategoryList.clear();mCategoryList.addAll(object.getCategories());head(mCategoryList);setTextViewsClick(textViews);}mOnDmandLoading = false;}@Override
            public void onError(int i, String s) {Log.e(TAG, "获取内容分类失败" + i + "eeee" + s);}});}//   根据分类ID  和 标签名来获取 标签后的ListView 的展示数据

    public void getAlbums(int mCatrgoryId,String mTagName){Map<String,String> map = new HashMap<String,String>();map.put(DTransferConstants.CATEGORY_ID, "" + mCatrgoryId);map.put(DTransferConstants.TAG_NAME, mTagName);map.put(DTransferConstants.PAGE, "" + mPageId);CommonRequest.getAlbums(map, new IDataCallBack<AlbumList>() {@Override
            public void onSuccess(AlbumList object) {if (object != null && object.getAlbums() != null) {if (mAlbumList == null) {mAlbumList = object;} else {mAlbumList.getAlbums().clear();mAlbumList.getAlbums().addAll(object.getAlbums());}/*   Log.e(TAG, "getAlbums mAlbumList:----------------------- " + mAlbumList);*/

                    getTracks((int) mAlbumList.getAlbums().get(0).getId());}}@Override
            public void onError(int i, String s) {Log.e(TAG, "获取标签后的ListView的展示数据失败"+s.toString()+"-----------"+i);}});}public void getTracks(int mAlbumId){Map<String,String> map =new HashMap<String,String>();map.put(DTransferConstants.ALBUM_ID,""+mAlbumId);  //专辑ID
        map.put(DTransferConstants.SORT, "asc");   //asc-正序或desc-倒序,默认为asc-正序
        map.put(DTransferConstants.PAGE, "" + mPageId);CommonRequest.getTracks(map, new IDataCallBack<TrackList>() {@Override
            public void onSuccess(TrackList object) {if(object!=null &&object.getTracks()!=null &&object.getTracks().size()!=0){mTrackList.clear();mTrackList.addAll(object.getTracks());mTingTrackAdapter.notifyDataSetChanged();mPlayerManager.playList(mTrackList, 0);  //用来播放  我设置第一次进来时默认播放第一条


                    index = 0;TingApplication.isTingPlaying = true;TingApplication.tingOrMusic = "ting";}}@Override
            public void onError(int i, String s) {Log.e(TAG, "222222222获取标签后的ListView的展示数据失败"+s.toString()+"-----------"+i);}});}//  测试用
    // 根据分类和标签获取某个分类某个标签下的专辑列表(最火/最新/最多播放)





    //动态添加分类列表
   public void head(List<Category>  mCategoryList){if(mCategoryList.size()!=0){for(int i=0;i<mCategoryList.size();i++){TextView tv =new TextView(this);LinearLayout.LayoutParams tv_lp =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);tv.setText(mCategoryList.get(i).getCategoryName());tv.setTextColor(getResources().getColor(R.color.radingtv));tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.nav_strategy_text_size));tv.setGravity(Gravity.CENTER);tv.setSingleLine(true);tv.setId(i);tv.setFocusable(true);ting_choose.addView(tv);//  Log.e(TAG,"ting_choose:"+ting_choose);
               //为最左边加边距

               if(i==0){tv_lp.setMargins((int) getResources().getDimension(R.dimen.nav_strategy_text_margin_left_right), 0, 0, 0);tv.setLayoutParams(tv_lp);tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.nav_strategysize));//第一次进這个页面时。默认显示第一条  分类的标签类容  第一个分类id  有声书是3
                   getCategoryTag(3);mTagGridView.setVisibility(View.VISIBLE);mCategory = mCategoryList.get(0);tv.setTextColor(ContextCompat.getColor(MainActivity.this, R.color.choose_blue));}//为最右边加边距
               if (i == mCategoryList.size() - 1) {tv_lp.setMargins(0, 0, (int) getResources().getDimension(R.dimen.nav_strategy_text_margin_left_right), 0);tv.setLayoutParams(tv_lp);}/**
                * 添加中间分割小view
                */
               if (i != mCategoryList.size() - 1) {View view_split = new View(this);LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(8, (int) getResources().getDimension(R.dimen.nav_strategy_split_view_height));layoutParams.gravity = Gravity.CENTER;view_split.setBackgroundResource(R.drawable.xiegang);layoutParams.setMargins((int) getResources().getDimension(R.dimen.nav_strategy_text_margin_left_right), 0,(int) getResources().getDimension(R.dimen.nav_strategy_text_margin_left_right), 0);view_split.setLayoutParams(layoutParams);ting_choose.addView(view_split);}textViews.add(tv);}}}//设置电台类别的点击事件  点击后加载类别下的标签
    private void setTextViewsClick(final List<TextView> tvLst){if(tvLst != null){for(int id =0;id<tvLst.size();id++){tvLst.get(id).setOnClickListener(new View.OnClickListener() {@Override
                    public void onClick(View v) {for(int j=0;j<tvLst.size();j++){if(v.getId()==tvLst.get(j).getId()){tvLst.get(j).setTextColor(ContextCompat.getColor(MainActivity.this, R.color.choose_blue));tvLst.get(j).setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.nav_strategysize));mTagGridView.setVisibility(View.VISIBLE);mCategory = mCategoryList.get(tvLst.get(j).getId());getCategoryTag((int)mCategory.getId());}else{tvLst.get(j).setTextColor(ContextCompat.getColor(MainActivity.this, R.color.radingtv));tvLst.get(j).setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.nav_strategy_text_size));}}}});}}}//获取分类列表后的标签

    public void getCategoryTag(int mCatrgoryId){Map<String,String> map = new HashMap<String,String>();map.put(DTransferConstants.CATEGORY_ID, "" + mCatrgoryId);map.put(DTransferConstants.TYPE, "" + 0);CommonRequest.getTags(map, new IDataCallBack<TagList>() {@Override
            public void onSuccess(TagList object) {if(object !=null &&object.getTagList() !=null){mTagList.clear();mTagList.addAll(object.getTagList());Log.e(TAG, "悬疑:" + object.getTagList().get(0).getTagName().toString());Log.e(TAG, "悬疑:" + object.getTagList().get(0).getKind().toString());mTingTagAdapter.notifyDataSetChanged();}}@Override
            public void onError(int i, String s) {}});}//播放器回调
    public IXmPlayerStatusListener mPlayerStatusListener =new IXmPlayerStatusListener() {//开始播放
        @Override
        public void onPlayStart() {Log.e(TAG, "================onPlayStart");TingApplication.isTingPlaying = true;}//暂停播放
        @Override
        public void onPlayPause() {Log.e(TAG,"====================onPlayPause");}//停止播放
        @Override
        public void onPlayStop() {Log.e(TAG,"onPlayStop");}//播放完成
        @Override
        public void onSoundPlayComplete() {Log.e(TAG,"=======================onSoundPlayComplete");}//播放器准备完毕
        @Override
        public void onSoundPrepared() {Log.e(TAG,"========================onSoundPrepared");}//切歌
        @Override
        public void onSoundSwitch(PlayableModel playableModel, PlayableModel playableModel1) {Log.e(TAG,"===================onSoundSwitch");if(mTingTrackAdapter !=null){mTingTrackAdapter.notifyDataSetChanged();mTingTrackListView.setSelection(index);}PlayableModel model = mPlayerManager.getCurrSound();Log.e(TAG,"*********************"+model);if(model!=null){String title = null;String msg = null;String coverUrl = null;String coverSmall = null;if (model instanceof Track) {Track info = (Track) model;title = info.getTrackTitle();msg = info.getAnnouncer() == null ? "" : info.getAnnouncer().getNickname();coverUrl = info.getCoverUrlLarge();coverSmall = info.getCoverUrlSmall();} else if (model instanceof Radio) {Radio radio = (Radio) model;Log.e(TAG,"radio:"+radio.getRadioName());title = radio.getRadioName();msg = radio.getRadioDesc();coverUrl = radio.getCoverUrlLarge();coverSmall = radio.getCoverUrlSmall();}}}//开始开始缓冲
        @Override
        public void onBufferingStart() {Log.e(TAG,"====================onBufferingStart");}//结束缓冲
        @Override
        public void onBufferingStop() {Log.e(TAG,"===================onBufferingStop");}//缓冲进度回调
        @Override
        public void onBufferProgress(int i) {Log.e(TAG,"===================onBufferProgress");}//播放进度回调
        @Override
        public void onPlayProgress(int i, int i1) {Log.e(TAG,"==========================onPlayProgress");}//播放器错误
        @Override
        public boolean onError(XmPlayerException e) {Log.e(TAG,"===========================onError"+e.getMessage().toString());return false;}};}

TingTagAdapter.class

package com.testopensourceapplication.tingproject;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.ximalaya.ting.android.opensdk.model.tag.Tag;import java.util.ArrayList;
import java.util.List;/**
 * Created by HL on 2016/12/21.
 */
public class TingTagAdapter extends BaseAdapter {private List<Tag> mTagList =new ArrayList<Tag>();private Context context;public TingTagAdapter(List<Tag> mTagList,Context context){this.mTagList = mTagList;this.context = context;}@Override
    public int getCount() {return mTagList.size();}@Override
    public Object getItem(int position) {return mTagList.get(position);}@Override
    public long getItemId(int position) {return position;}@Override
    public View getView(int position, View convertView, ViewGroup parent) {TingViewHolder holder;//Log.e("TAG","mTagList"+mTagList.get(position).getTagName()+"0000000000000000000000000000");
        if(convertView == null){convertView =LayoutInflater.from(context).inflate(R.layout.ting_item_content,parent,false);holder =new TingViewHolder();holder.content =(ViewGroup)convertView;holder.cover = (ImageView) convertView.findViewById(R.id.iv_item_picture);holder.cover.setVisibility(View.GONE);holder.title = (TextView) convertView.findViewById(R.id.tv_item_name);convertView.setTag(holder);}else{holder = (TingViewHolder) convertView.getTag();}Tag tag = mTagList.get(position);/* if(tag.getTagName().length()>4){
            String  tagname = tag.getTagName();
            String Fristindex =tagname.substring(0,4);
            String endIndex = tagname.substring()
            Log.e("TAG", "Fristindex:" + Fristindex.toString());
       }*/
        holder.title.setText(tag.getTagName());return convertView;}}

TingTrasksAdapter.class

package com.testopensourceapplication.tingproject;import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.ximalaya.ting.android.opensdk.model.PlayableModel;
import com.ximalaya.ting.android.opensdk.model.track.Track;
import com.ximalaya.ting.android.opensdk.player.XmPlayerManager;import net.tsz.afinal.FinalBitmap;import java.util.ArrayList;
import java.util.List;/**
 * Created by HL on 2016/12/22.
 */
public class TingTracksAdapter extends BaseAdapter {private List<Track> mTrackList = new ArrayList<Track>();private Context mContext;private FinalBitmap mFinalBitmap;private XmPlayerManager mPlayerManager;public TingTracksAdapter(List<Track> mTrackList,Context mContext,FinalBitmap mFinalBitmap,XmPlayerManager mPlayerManager){this.mTrackList = mTrackList;this.mContext   =  mContext;this.mFinalBitmap = mFinalBitmap;this.mPlayerManager = mPlayerManager;}@Override
    public int getCount() {if(mTrackList ==null){return 0;}return mTrackList.size();}@Override
    public Object getItem(int position) {return mTrackList.get(position);}@Override
    public long getItemId(int position) {return position;}@Override
    public View getView(int position, View convertView, ViewGroup parent) {TingViewHolder holder;if(convertView == null){convertView =LayoutInflater.from(mContext).inflate(R.layout.ting_track_content,parent,false);holder = new TingViewHolder();holder.content = (ViewGroup) convertView;holder.cover = (ImageView) convertView.findViewById(R.id.ting_imageview);holder.title = (TextView) convertView.findViewById(R.id.trackname);holder.intro = (TextView) convertView.findViewById(R.id.intro);convertView.setTag(holder);}else{holder =(TingViewHolder)convertView.getTag();}Track  sound =mTrackList.get(position);holder.title.setText(sound.getTrackTitle());holder.intro.setText(sound.getAnnouncer() == null ? sound.getTrackTags() : sound.getAnnouncer().getNickname());mFinalBitmap.display(holder.cover, sound.getCoverUrlSmall());PlayableModel curr = mPlayerManager.getCurrSound();if(sound.equals(curr)){holder.content.setBackgroundResource(R.drawable.ting_item_bg);}else{holder.content.setBackgroundColor(Color.BLACK);}return convertView;}
}

TingViewHolder.class

package com.testopensourceapplication.tingproject;import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;/**
 * Created by HL on 2016/12/21.
 */
public class TingViewHolder {public ViewGroup content;public ImageView cover;public TextView title;public TextView intro;public RoundImageView Circularcover;}

PlayerControlRecevice.class

package com.testopensourceapplication.tingproject;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;import com.ximalaya.ting.android.opensdk.player.XmPlayerManager;/**
 * 喜马拉雅的广播接收
 *
 * @author HL
 * @date 2016年12月23日
 */
public class PlayerControlReceiver extends BroadcastReceiver {//喜马拉雅模块
    public static final String ACTION_CONTROL_PLAY_PAUSE = "com.infisight.ting.ACTION_CONTROL_PLAY_PAUSE";public static final String ACTION_CONTROL_PLAY_PRE = "com.infisight.ting.ACTION_CONTROL_PLAY_PRE";public static final String ACTION_CONTROL_PLAY_NEXT = "com.infisight.ting.ACTION_CONTROL_PLAY_NEXT";@Override
    public void onReceive(Context context, Intent intent) {XmPlayerManager manager = XmPlayerManager.getInstance(context);String action = intent.getAction();if (ACTION_CONTROL_PLAY_PAUSE.equals(action)) {if (manager.isPlaying()) {manager.pause();} else {manager.play();}} else if (ACTION_CONTROL_PLAY_NEXT.equals(action)) {manager.playNext();} else if (ACTION_CONTROL_PLAY_PRE.equals(action)) {manager.playPre();}}}

TingApplication.class

package com.testopensourceapplication.tingproject;/**
 * Created by HL on 2016/12/22.
 */
public class TingApplication {public static String TAG="TingApplication";public static String tingOrMusic = null;public static boolean isMusicPlaying = false;public static boolean isTingPlaying = false;
}

主要代码已经放上去了,Demo 地址下载:http://download.csdn.net/detail/pigseesunset/9719263

Android 接喜马拉雅电台接口(2)------功能实现篇相关推荐

  1. android听书功能实现,基于Android的喜马拉雅听书的实现.docx

    摘要:当今时代,智能手机已经成为了人们生活中必不可少的一种工具,它的便携和功能的强大无时无刻不方便着我们的生活.而且智能手机有着庞大的市场,上到老人下到小孩,无一不对智能手机的功能有所耳闻,其中绝大部 ...

  2. android 新闻功能列表,android根据提供的接口获取新闻列表

    查询新闻列表: 接口名称:GetNewsInfo 接口参数:(string account(账号), string pwd(密码), string newstype(新闻类型[图文新闻(传入4),图片 ...

  3. 意想不到:Android手机的12项额外功能

    意想不到:Android手机的12项额外功能 2014-05-28 09:48:16| 发布者: scy| 查看数:383 摘要: 5月28日消息,众所周知,苹果.微软和谷歌对待手机操作系统的态度是完 ...

  4. Android 5.0中的FDE功能实现

    标 题:  [分享]Android 5.0中的FDE功能实现 作 者: netsniffer 时 间: 2015-01-27,21:15:06 链 接: http://bbs.pediy.com/sh ...

  5. Python中使用requests和parsel爬取喜马拉雅电台音频

    场景 喜马拉雅电台: https://www.ximalaya.com/ 找到一步小说音频,这里以下面为例 https://www.ximalaya.com/youshengshu/16411402/ ...

  6. android 如何使用Parcelable接口

    今天,简单讲讲android如何使用Parcelable接口传递数据. 这个其实也很简单,之前我写过博客将关于Serializable接口传递对象,实现Parcelable接口也是为了传递对象,但效率 ...

  7. Android 8.0学习(31)---Android 8.0 中的 ART 功能改进

    Android 8.0 中的 ART 功能改进 在 Android 8.0 版本中,Android Runtime (ART) 有了极大改进.下面的列表总结了设备制造商可以在 ART 中获得的增强功能 ...

  8. Android实现二维码扫描功能(四)-ZXing识别图片二维码,相册选图

    简介 上一篇 Android实现二维码扫描功能(三)-闪光灯控制介绍了光线较弱情况下开启闪光灯来辅助二维码识别的方法. 本篇我们介绍如何识别相册中的图片(含二维码) 动态演示 使用模拟器录制了动画演示 ...

  9. Android手机的12项额外功能

    Android手机的12项额外功能 手机能做服务器 苹果.微软和谷歌三大平台厂商对待手机操作系统的态度完全不同,iOS和Windows Phone以安全为由限制用户和开发者接触系统核心,让用户丧失了很 ...

最新文章

  1. 如何在前端生成二维码
  2. Red5 webapp配置
  3. Java与C++有何区别呢?请看以下几点就明白了……
  4. 计算机桌面设置定时,如何设置可以每月自动变化的日历桌面?
  5. elementary OS下netbeans中文乱码的问题
  6. 使用批处理文件(batch file)替换字符串
  7. Atitit it系列书籍列表 C:\Users\Administrator\Documents\it 软件系列书籍\itlist.txt C:\Users\Administrator\Docume
  8. 常用射频接头之2.92mm
  9. ajax $.get怎么使用,jquery之ajax之$.get方法的使用
  10. 北邮电教授思想洗礼之不二之选TGB
  11. 视频号带货优势有哪些?普通人为什么要做视频号:国仁楠哥
  12. 浏览器视频文件分段缓存合并成完整的视频
  13. FPGA与普通CPU的区别
  14. 2020年编程语言排行榜!
  15. excel中如何将文本格式数字转为数字格式
  16. IIS7+PHP安装教程
  17. 全球及中国农业机械LED灯行业竞争力调查及销售规模研究报告2021年版
  18. java umeditor使用,百度UMeditor富文本编辑器java使用
  19. java中amal_影中真相 | 历史是无情者对无脑者的胜利
  20. 大规模视频内容理解:淘宝视频内容标签的结构化分析和管理

热门文章

  1. 如何规划城市旧改中的商业街
  2. 倍福:TwincAT配置汇川EtherCAT伺服,NC有数值变化,但电机不转,NC报错17744
  3. 【MATLAB教程案例70】通过MATLAB编程实现模糊控制器1——编程定义模糊规则和隶属函数(不使用FIS Editor)
  4. 分治算法:根号n段合并排序算法
  5. EFM32例程——GPIO
  6. 2022年工业机器人的5大应用行业
  7. 如何打开计算机本地管理,电脑怎么强制重启(就可以重启本地或远程电脑)
  8. EasyNVR实现海康、大华NVR硬盘录像机Web无插件播放方案(支持取特定时间段视频流)...
  9. 自己写一个安卓通讯录软件
  10. 拒绝不合理需求的4个方法