android小项目之音乐播放器二

2023-11-15



Android应用开发--MP3音乐播放器代码实现(一)


需求1:将内存卡中的MP3音乐读取出来并显示到列表当中

1.   从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象
2.   迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中
3.   定义一个List集合,把Map对象添加到List集合当中
4.   通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中

  1. /** 
  2. * 用于从数据库中查询歌曲的信息,保存在List当中 
  3. * 
  4. * @return 
  5. */  
  6. public List<Mp3Info> getMp3Infos() {  
  7.     Cursor cursor = getContentResolver().query(  
  8.         MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, nullnullnull,  
  9.         MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
  10.     List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();  
  11.     for (int i = 0; i < cursor.getCount(); i++) {  
  12.         Mp3Info mp3Info = new Mp3Info();  
  13.         cursor.moveToNext();  
  14.         long id = cursor.getLong(cursor  
  15.             .getColumnIndex(MediaStore.Audio.Media._ID));   //音乐id  
  16.         String title = cursor.getString((cursor   
  17.             .getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题  
  18.         String artist = cursor.getString(cursor  
  19.             .getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家  
  20.         long duration = cursor.getLong(cursor  
  21.             .getColumnIndex(MediaStore.Audio.Media.DURATION));//时长  
  22.         long size = cursor.getLong(cursor  
  23.             .getColumnIndex(MediaStore.Audio.Media.SIZE));  //文件大小  
  24.         String url = cursor.getString(cursor  
  25.             .getColumnIndex(MediaStore.Audio.Media.DATA));              //文件路径  
  26.     int isMusic = cursor.getInt(cursor  
  27.         .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐  
  28.     if (isMusic != 0) {     //只把音乐添加到集合当中  
  29.         mp3Info.setId(id);  
  30.         mp3Info.setTitle(title);  
  31.         mp3Info.setArtist(artist);  
  32.         mp3Info.setDuration(duration);  
  33.         mp3Info.setSize(size);  
  34.         mp3Info.setUrl(url);  
  35.         mp3Infos.add(mp3Info);  
  36.         }  
  37.     }  
  38. return mp3Infos;  
  39. }  
/**
* 用于从数据库中查询歌曲的信息,保存在List当中
*
* @return
*/
public List<Mp3Info> getMp3Infos() {
	Cursor cursor = getContentResolver().query(
		MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
		MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
	List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();
	for (int i = 0; i < cursor.getCount(); i++) {
		Mp3Info mp3Info = new Mp3Info();
		cursor.moveToNext();
		long id = cursor.getLong(cursor
			.getColumnIndex(MediaStore.Audio.Media._ID));	//音乐id
		String title = cursor.getString((cursor	
			.getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题
		String artist = cursor.getString(cursor
			.getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家
		long duration = cursor.getLong(cursor
			.getColumnIndex(MediaStore.Audio.Media.DURATION));//时长
		long size = cursor.getLong(cursor
			.getColumnIndex(MediaStore.Audio.Media.SIZE));	//文件大小
		String url = cursor.getString(cursor
			.getColumnIndex(MediaStore.Audio.Media.DATA));				//文件路径
	int isMusic = cursor.getInt(cursor
		.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐
	if (isMusic != 0) {		//只把音乐添加到集合当中
		mp3Info.setId(id);
		mp3Info.setTitle(title);
		mp3Info.setArtist(artist);
		mp3Info.setDuration(duration);
		mp3Info.setSize(size);
		mp3Info.setUrl(url);
		mp3Infos.add(mp3Info);
		}
	}
return mp3Infos;
}

  1. /** 
  2.      * 填充列表 
  3.      * @param mp3Infos 
  4.      */  
  5.     public void setListAdpter(List<Mp3Info> mp3Infos) {  
  6.         List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();  
  7.         for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {  
  8.             Mp3Info mp3Info = (Mp3Info) iterator.next();  
  9.             HashMap<String, String> map = new HashMap<String, String>();  
  10.             map.put("title", mp3Info.getTitle());  
  11.             map.put("Artist", mp3Info.getArtist());  
  12.             map.put("duration", String.valueOf(mp3Info.getDuration()));  
  13.             map.put("size", String.valueOf(mp3Info.getSize()));  
  14.             map.put("url", mp3Info.getUrl());  
  15.             mp3list.add(map);  
  16.         }  
  17.         mAdapter = new SimpleAdapter(this, mp3list,  
  18.                 R.layout.music_list_item_layout, new String[] { "title""Artist""duration" },  
  19.                 new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });  
  20.         mMusiclist.setAdapter(mAdapter);      
  21.     }  
/**
	 * 填充列表
	 * @param mp3Infos
	 */
	public void setListAdpter(List<Mp3Info> mp3Infos) {
		List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();
		for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
			Mp3Info mp3Info = (Mp3Info) iterator.next();
			HashMap<String, String> map = new HashMap<String, String>();
			map.put("title", mp3Info.getTitle());
			map.put("Artist", mp3Info.getArtist());
			map.put("duration", String.valueOf(mp3Info.getDuration()));
			map.put("size", String.valueOf(mp3Info.getSize()));
			map.put("url", mp3Info.getUrl());
			mp3list.add(map);
		}
		mAdapter = new SimpleAdapter(this, mp3list,
				R.layout.music_list_item_layout, new String[] { "title", "Artist", "duration" },
				new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });
		mMusiclist.setAdapter(mAdapter);	
	}

实现效果如图:

   



需求2:点击列表的每一项,启动一个服务来播放音乐

1.   注册条目点击监听器OnItemClickListener

2.   定义一个实现OnItemClickListener接口的内部类

3.   定义一个继承Service的服务类PlayerServie



1.   注册条目点击监听器OnItemClickListener

  1. mMusiclist = (ListView) findViewById(R.id.music_list);  
  2.         mMusiclist.setOnItemClickListener(new MusicListItemClickListener());  
  3.         mp3Infos = getMp3Infos();  
  4.         setListAdpter(getMp3Infos());  
mMusiclist = (ListView) findViewById(R.id.music_list);
		mMusiclist.setOnItemClickListener(new MusicListItemClickListener());
		mp3Infos = getMp3Infos();
		setListAdpter(getMp3Infos());


2.   定义一个实现OnItemClickListener接口的内部类
  1. private class MusicListItemClickListener implements OnItemClickListener {  
  2.     @Override  
  3.     public void onItemClick(AdapterView<?> parent, View view, int position,  
  4.             long id) {  
  5.         if(mp3Infos != null) {  
  6.             Mp3Info mp3Info = mp3Infos.get(position);  
  7.             Log.d("mp3Info-->", mp3Info.toString());  
  8.             Intent intent = new Intent();  
  9.             intent.putExtra("url", mp3Info.getUrl());         
  10.             intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);  
  11.             intent.setClass(MainActivity.this, PlayerService.class);  
  12.             startService(intent);       //启动服务  
  13.         }  
  14.     }  
  15. }  
private class MusicListItemClickListener implements OnItemClickListener {
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		if(mp3Infos != null) {
			Mp3Info mp3Info = mp3Infos.get(position);
			Log.d("mp3Info-->", mp3Info.toString());
			Intent intent = new Intent();
			intent.putExtra("url", mp3Info.getUrl());		
			intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
			intent.setClass(MainActivity.this, PlayerService.class);
			startService(intent);		//启动服务
		}
	}
}


3.   定义一个继承Service的服务类PlayerServie(未完善的Service类)

  1. package com.wwj.sb.service;  
  2.   
  3.   
  4. import android.annotation.SuppressLint;  
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.media.MediaPlayer;  
  8. import android.media.MediaPlayer.OnPreparedListener;  
  9. import android.os.IBinder;  
  10.   
  11. import com.wwj.sb.domain.AppConstant;  
  12.   
  13. @SuppressLint("NewApi")  
  14. public class PlayerService extends Service {  
  15.     private MediaPlayer mediaPlayer =  new MediaPlayer();       //媒体播放器对象  
  16.     private String path;                        //音乐文件路径  
  17.     private boolean isPause;                    //暂停状态  
  18.       
  19.     @Override  
  20.     public IBinder onBind(Intent arg0) {  
  21.         return null;  
  22.     }  
  23.       
  24.     @Override  
  25.     public int onStartCommand(Intent intent, int flags, int startId) {  
  26.         if(mediaPlayer.isPlaying()) {  
  27.             stop();  
  28.         }  
  29.         path = intent.getStringExtra("url");          
  30.         int msg = intent.getIntExtra("MSG"0);  
  31.         if(msg == AppConstant.PlayerMsg.PLAY_MSG) {  
  32.             play(0);  
  33.         } else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {  
  34.             pause();  
  35.         } else if(msg == AppConstant.PlayerMsg.STOP_MSG) {  
  36.             stop();  
  37.         }  
  38.         return super.onStartCommand(intent, flags, startId);  
  39.     }  
  40.       
  41.   
  42.     /** 
  43.      * 播放音乐 
  44.      * @param position 
  45.      */  
  46.     private void play(int position) {  
  47.         try {  
  48.             mediaPlayer.reset();//把各项参数恢复到初始状态  
  49.             mediaPlayer.setDataSource(path);  
  50.             mediaPlayer.prepare();  //进行缓冲  
  51.             mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器  
  52.         }  
  53.         catch (Exception e) {  
  54.             e.printStackTrace();  
  55.         }  
  56.     }  
  57.       
  58.     /** 
  59.      * 暂停音乐 
  60.      */  
  61.     private void pause() {  
  62.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  63.             mediaPlayer.pause();  
  64.             isPause = true;  
  65.         }  
  66.     }  
  67.       
  68.     /** 
  69.      * 停止音乐 
  70.      */  
  71.     private void stop(){  
  72.         if(mediaPlayer != null) {  
  73.             mediaPlayer.stop();  
  74.             try {  
  75.                 mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数  
  76.             } catch (Exception e) {  
  77.                 e.printStackTrace();  
  78.             }  
  79.         }  
  80.     }  
  81.       
  82.       
  83.     @Override  
  84.     public void onDestroy() {  
  85.         if(mediaPlayer != null){  
  86.             mediaPlayer.stop();  
  87.             mediaPlayer.release();  
  88.         }  
  89.     }  
  90.     /** 
  91.      *  
  92.      * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放 
  93.      * 
  94.      */  
  95.     private final class PreparedListener implements OnPreparedListener {  
  96.         private int positon;  
  97.           
  98.         public PreparedListener(int positon) {  
  99.             this.positon = positon;  
  100.         }  
  101.           
  102.         @Override  
  103.         public void onPrepared(MediaPlayer mp) {  
  104.             mediaPlayer.start();    //开始播放  
  105.             if(positon > 0) {    //如果音乐不是从头播放  
  106.                 mediaPlayer.seekTo(positon);  
  107.             }  
  108.         }  
  109.     }  
  110.       
  111. }  
package com.wwj.sb.service;


import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.IBinder;

import com.wwj.sb.domain.AppConstant;

@SuppressLint("NewApi")
public class PlayerService extends Service {
	private MediaPlayer mediaPlayer =  new MediaPlayer();		//媒体播放器对象
	private String path;						//音乐文件路径
	private boolean isPause;					//暂停状态
	
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		if(mediaPlayer.isPlaying()) {
			stop();
		}
		path = intent.getStringExtra("url");		
		int msg = intent.getIntExtra("MSG", 0);
		if(msg == AppConstant.PlayerMsg.PLAY_MSG) {
			play(0);
		} else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {
			pause();
		} else if(msg == AppConstant.PlayerMsg.STOP_MSG) {
			stop();
		}
		return super.onStartCommand(intent, flags, startId);
	}
	

	/**
	 * 播放音乐
	 * @param position
	 */
	private void play(int position) {
		try {
			mediaPlayer.reset();//把各项参数恢复到初始状态
			mediaPlayer.setDataSource(path);
			mediaPlayer.prepare();	//进行缓冲
			mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 暂停音乐
	 */
	private void pause() {
		if (mediaPlayer != null && mediaPlayer.isPlaying()) {
			mediaPlayer.pause();
			isPause = true;
		}
	}
	
	/**
	 * 停止音乐
	 */
	private void stop(){
		if(mediaPlayer != null) {
			mediaPlayer.stop();
			try {
				mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	
	@Override
	public void onDestroy() {
		if(mediaPlayer != null){
			mediaPlayer.stop();
			mediaPlayer.release();
		}
	}
	/**
	 * 
	 * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放
	 *
	 */
	private final class PreparedListener implements OnPreparedListener {
		private int positon;
		
		public PreparedListener(int positon) {
			this.positon = positon;
		}
		
		@Override
		public void onPrepared(MediaPlayer mp) {
			mediaPlayer.start();	//开始播放
			if(positon > 0) {	//如果音乐不是从头播放
				mediaPlayer.seekTo(positon);
			}
		}
	}
	
}


以上代码实现了两个需求,显示音乐列表和实现列表点击事件启动Servic。下次会实现控制音乐播放的需求

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android小项目之音乐播放器二 的相关文章

  • 小程序和网页的区别

    小程序和网页有什么区别呢 下面我们拿微信小程序来举例 运行环境 网页 在浏览器中运行 微信小程序 在微信中运行 开发环境 网页 代码编辑器 vscode 网页浏览器 chrome 微信小程序 代码编辑器 vscode 微信模拟器 微信开发者
  • mfc140.dll丢失怎样修复-由于找不到mfc140.dll无法继续执行代码的解决方法

    mfc140 dll是电脑文件中的dll文件 动态链接库文件 如果计算机中丢失了某个dll文件 可能会导致某些软件和游戏等程序无法正常启动运行 并且导致电脑系统弹窗报错 在电脑随便打开一个浏览器然后在顶部输入 dll修复程序 site 按下
  • Linux系统下安装jdk及环境配置(两种方法)

    这里介绍两种linux环境下jdk的安装以及环境配置方法 在windows系统安装jdk以及环境配置 相信大家都会 这里就不做赘述了 这里主要讲讲linux下的jdk安装以及环境配置 第一种属于傻瓜式安装 一键安装即可 yum安装 第二种手
  • 指针和引用 , 指针空值nullptr

    引用和指针 1 引用概念 引用不是新定义一个变量 而是给已存在变量取了一个别名 编译器不会为引用变量开辟内存空间 它和它引用的变量共用同一块内存空间 使用方式和普通变量相同 当原变量来对待 比如 李逵 在家称为 铁牛 江湖上人称 黑旋风 底
  • 不同岛屿的数量

    694 不同岛屿的数量 这道题要给出不同岛屿的数量 最直观的想法就是对发现的不同岛屿进行序列化 然后把序列化结果存到HashSet 那怎么序列化呢 其实比较类似于二叉树的序列化 记录遍历顺序 方向 这里用 1 2 3 4 代表上下左右 1
  • 全网最详细网络安全学习路线!手都给我码酸了!

    零基础小白 学完掌握可就业 入门到入土的网安学习路线 在各大平台搜的网安学习路线都太粗略了 看不下去了 我把自己报班的系统学习路线 整理拿出来跟大家分享了 本文为纯干货纯文字内容 需要详细学习路线图以及配套资料的同学可留言或者后台踢我免费分
  • 什么是计算机视觉

    计算机视觉 让计算机 看懂 和视频 这是什么场景 画面里都有什么 人 车和房子在什么位置 目标在做什么 目标间有什么关系 视觉是自然智能不可思议的结晶 猕猴的大脑皮层中视觉部分占据大约50 人脑中有关视觉的部分所占比重大 人类大脑对视觉进行
  • Linux下EC20实现ppp拨号

    硬件描述 EC20模块封装成标准的PCIe接口 和系统之家通讯主要通过usb通讯 系统描述 此处使用的是Linux 3 0 1 一 驱动支持 首先需要对Linux内核驱动做一定的修改 使操作系统能够支持EC20 1 Add VID add
  • Windows 无法启动MySql服务 (位于 本地计算机上)错误2: 系统找不到指定的文件

    错误 Windows 无法启动MySql服务 位于 本地计算机上 错误2 系统找不到指定的文件 错误原因 服务的路径与安装的路径不一致 之前安装过mysql后卸载重装容易出现这样的问题 解决方法 修改windows注册表 windows r
  • DC-DC升压电路

    目录 实验目的 课程条件 原理框图和实验思路 实验原理图 电路图分析
  • memcached server LRU 深入分析

    Memcached 人所皆知的remote distribute cache 不知道的可以javaeye一下下 或者google一下下 或者baidu一下下 但是鉴于baidu的排名商业味道太浓 从最近得某某事件可以看出 所以还是建议jav
  • 【Java基础】异常

    文章目录 1 基本信息 2 Throwable 体系 2 1 Exception 2 2 Error 2 3 常见的 Exception 和 Error 3 异常的处理 3 1 抛出异常throw 3 2 捕获异常try catch fin
  • OpenAI API(ChatGPT)接口地址https://api.openai.com/v1/chat网络问题无法访问Error: connect ECONNREFUSED ETIMEDOUT

    https api openai com v1 chat是openAI的API接口地址 因为长城的原因 23年年初一次更新后便无法访问 访问接口会提示Error connect ETIMEDOUT等网络相关的问题 解决办法有三种 本文只做方
  • 分类算法的R语言实现案例

    最近在读 R语言与网站分析 书中对分类 聚类算法的讲解通俗易懂 和数据挖掘理论一起看的话 有很好的参照效果 然而 这么好的讲解 作者居然没提供对应的数据集 手痒之余 我自己动手整理了一个可用于分类算法的数据集 下载链接 csdn下载频道搜索
  • Java实现将数字转化为繁体汉字表示

    在CSDN论坛上看到了一个帖子 要求用Java实现将数字转化为繁体汉字表示 如 输入一个数字将其转化为大写 比如输入整型1034 得到 壹仟零叁拾肆 看了之后感觉挺有意思的 自己也就写了一个 代码如下 实现将数字转化为繁体汉字表示 impo
  • TensorFlow2学习(一):介绍及安装测试

    TensorFlow是什么 从计算机发明之初 人们就希望它能够帮助甚至代替人类完成重复性劳作 利用巨大的存储空间和超高的运算速度 计算机已经可以非常轻易地完成一些对于人类非常困难 但对计算机相对简单的问题 比如统计一本书中不同单词出现的次数
  • 使用vuex完成加入购物车案例

    需求 当点击了加入购物车按键后 把商品添加到购物车中 步骤 先获取商品的数据 保存到仓库中 将数据保存到本地存储 在购物车页面 从本地进行调用数据 进行页面渲染 页面组成

随机推荐

  • python3 根据ip获取国家

    pip install geoip2 https blog csdn net hxm6621315 article details 127774378
  • Python-打印螺旋矩阵

    问题描述 输入N 打印 N N 螺旋矩阵 比如 N 3 打印 1 2 3 8 9 4 7 6 5 N 4 打印 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 思路 常规法是不断的对数据边界进行判断会很复杂 不
  • vue界面转为静态html,html静态页面通过vue实现数据动态化

    看完觉得有用记得给个赞奥 你的赞就是我的动力 1 引入vue 引入jQuery 因为等下用Ajax请求数据用到jQuery 如 2 初始化并绑定vue 首先在自己的网页body内添加一个div包括所有内容 并给这个div设置id 如 Doc
  • 对象在内存中的初始化过程

    参考 1 https blog csdn net WantFlyDaCheng article details 81808064 2 深入理解java虚拟机 Student s new Student 为例 1 首先查看类的符号引用 看是否
  • EC纠删码(Erasure Code)校验码算法相比传统RAID5有哪些优势?

    EC纠删码 Erasure Code 校验码算法相比传统RAID5有哪些优势 1 EC算法是跨节点的 4 2 1的冗余允许1个节点故障而不丢失数据 RAID5一般是由节点内的若干块盘组成RAID组的 只能容忍硬盘故障 不能容忍节点故障 2
  • 0基础速通html

    一 基础认知 1 网页 网页组成 文字 图片 音频 视频 超链接 程序员写的代码是通过什么软件转换成网页的 浏览器 2 浏览器 是网页显示 运行的平台 是前端开发必备利器 常见的五大浏览器 IE浏览器 火狐浏览器 谷歌浏览器 Safari浏
  • Android DataBinding 学习(二)

    dataBinding 二 1 在布局中使用vm变量进行资源判断 场景 点击按钮 对应的圆和按钮本身的背景颜色发生改变 不需要单独在代码中设置其背景色 可以直接在布局中镶嵌 VM public class TestVM public Obs
  • UE4_Python编写,Pycharm智能提示API

    1 按照教程配置环境 在对应的目录下会有一个unreal py 的文件 把它粘贴到对应的Python的项目目录 2 因为Pycharm 的py 文件 默认支持的智能提示是 the file size 10 5mb exceeds confi
  • Mk配置aar文件遇到的问题记录

    第一步 include CLEAR VARS LOCAL PREBUILT STATIC JAVA LIBRARIES demo libs demo aar 要添加的aar LOCAL AAPT FLAGS auto add overlay
  • LocalDateTime和字符串相互转换------时间转换:

    Test public void timeTest04 throws ParseException String dateTime 2022 03 21T02 29 13 732843 DateTimeFormatter dateTimeF
  • MTK Pump Express 快速充电原理分析

    1 MTK PE 1 1 原理 在讲正文之前 我们先看一个例子 对于一块电池 我们假设它的容量是6000mAh 并且标称电压是3 7V 换算成Wh 瓦时 为单位的值是22 3Wh 6000mAh 3 7V 普通的充电器输出电压电流是5V2A
  • ArcGIS 解决影像裁剪后锯齿问题

    矢量数据裁剪栅格数据的原理 个人理解 当输入矢量数据的范围完全包含或包含一个像元大小的50 及以上 裁剪时就默认把这个像元作为输出像元 反之 不输出 如下图 从而导致影像裁剪后存在锯齿问题 因此锯齿问题归根结底就是影像分辨率问题 导致结果就
  • chatgpt赋能python:Pythontomorrow:未来十年最重要的编程语言

    Python tomorrow 未来十年最重要的编程语言 Python 是一种高级 通用 解释型 面向对象的动态编程语言 自 1991 年诞生以来 Python 已成为了世界上最流行的编程语言之一 然而 Python 仍没有达到顶峰 未来的
  • C++客户端Modbus通信(TCP主站)

    本文简单介绍Qt使用外部modbus通信C 编程流程 modbus中文手册 https blog csdn net qq 23670601 article details 82155378 Qtmodbus较为方便 建议无特殊情况可以使用q
  • mysql中去除重复数据,只保留一条。

    梳理一下关于删除重复记录的逻辑 目录 前期准备 建表插入数据 1 通过group by 和count 1 gt 1找出有重复的数据 2 通过每个分组中的最小id来去重 2 1 添加主键id列 2 2 去重 2 2 1 首先找出每个分组中co
  • 数据结构:栈和队列的实现和图解二者相互实现

    文章目录 写在前面 栈 什么是栈 栈的实现 队列 什么是队列 队列的实现 用队列实现栈 用栈模拟队列 写在前面 栈和队列的实现依托的是顺序表和链表 如果对顺序表和链表不清楚是很难真正理解栈和队列的 下面为顺序表和链表的实现和图解讲解 手撕图
  • MySQL里datetime字段怎么设置默认时间

    Mysql 如何设置字段自动获取当前时间 TimeStamp和DateTime 转 MySQL datetime数据类型设置当前时间为默认值 两个方法 dateTime TimeStamp类型 建表时的设置 参考 mysql中datetim
  • 【ubuntu

    every blog every motto You can do more than you think https blog csdn net weixin 39190382 type blog 0 前言 ubuntu 22 04 安装
  • Shell脚本执行FTP操作

    一 从本地上传单个文件到FTP bin bash PUTFILE test txt ftp i v n ftp ip ftp port lt
  • android小项目之音乐播放器二

    Android应用开发 MP3音乐播放器代码实现 一 需求1 将内存卡中的MP3音乐读取出来并显示到列表当中 1 从数据库中查询所有音乐数据 保存到List集合当中 List当中存放的是Mp3Info对象 2 迭代List集合 把每一个Mp