活动介绍

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_yuyuexuanze); dbhelper = new DBHelper(this); mDbWriter = dbhelper.getWritableDatabase(); Intent intent=getIntent(); name=intent.getStringExtra("username"); initView(); Calendar myCalendar = Calendar.getInstance(Locale.CHINA); Date myDate = new Date(); myCalendar.setTime(myDate);是什么,意思

时间: 2024-03-18 21:45:28 浏览: 172
这是一个在 Android 应用程序中创建活动(Activity)时自动生成的 onCreate 方法,它会在 Activity 创建时被调用。该方法会首先调用父类的 onCreate 方法,然后设置与该 Activity 相关联的布局文件。接下来,它会初始化一个 DBHelper 对象,并获取可写的数据库实例。然后,它会获取通过 Intent 传递过来的用户名(username)并进行初始化。最后,它会获取当前时间并将其转换为中国时间,并将其保存在 myCalendar 和 myDate 变量中。
相关问题

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_doctor); dbHelper1 = new MyDatabaseHelper( DoctorActivity.this,"User_Data.db",null,1); personList = addPersonList(); recyclerView = findViewById(R.id.rv_device); personAdapter = new PersonAdapter(personList,this); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(personAdapter); }解释代码

这是一个 Android 应用程序的 Java 代码,用于在医生界面上显示一个 RecyclerView 列表,其中包含一些用户数据。在 onCreate 方法中,首先调用父类的 onCreate 方法并加载 DoctorActivity 的布局文件。然后,创建了一个名为 dbHelper1 的 MyDatabaseHelper 对象,用于连接到一个名为 User_Data.db 的 SQLite 数据库。接下来,定义了一个 personList 变量,用于存储要显示在 RecyclerView 中的用户数据。addPersonList() 方法是一个自定义方法,用于从数据库中获取用户数据并将其添加到 personList 中。之后,创建了一个 recyclerView 变量,用于显示 RecyclerView 控件。personAdapter 是一个自定义的 RecyclerView.Adapter 类型的适配器,用于将 personList 中的数据绑定到 RecyclerView 上。最后,设置 RecyclerView 的布局管理器为 LinearLayoutManager,用于按垂直方向显示列表项,并将 personAdapter 设置为 RecyclerView 的适配器。

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_users); lvProductList = findViewById(R.id.product_list); etProductName = findViewById(R.id.product_name); etProductPrice = findViewById(R.id.product_price); etProductQuantity = findViewById(R.id.product_quantity); btAddProduct = findViewById(R.id.add_product); btDeleteProduct = findViewById(R.id.delete_product); btEditProduct = findViewById(R.id.edit_product); spinner = findViewById(R.id.spinner); dbHelper = new DBHelper(this); db = dbHelper.getWritableDatabase(); btAddProduct.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String name = etProductName.getText().toString(); float price = Float.parseFloat(etProductPrice.getText().toString()); int quantity = Integer.parseInt(etProductQuantity.getText().toString()); ContentValues values = new ContentValues(); values.put(DBHelper.COLUMN_NAME,name); values.put(DBHelper.COLUMN_PRICE,price); values.put(DBHelper.COLUMN_QUANTITY,quantity); db.insertWithOnConflict(DBHelper.TABLE_NAME,null,values,SQLiteDatabase.CONFLICT_REPLACE); updateUI(); } });

这是 `users` 类中的 `onCreate()` 方法,用于初始化用户界面。在该方法中,首先调用 `setContentView()` 方法,将用户界面的布局文件加载到该活动中。接着,使用 `findViewById()` 方法获取布局文件中定义的 UI 控件,如 `ListView`、`EditText`、`Button`、`Spinner` 等等。然后,创建一个 `DBHelper` 对象,并调用 `getWritableDatabase()` 方法获取可写的数据库。接下来,为添加按钮 `btAddProduct` 添加一个点击事件监听器,在点击按钮时将用户输入的信息插入到数据库中,并调用 `updateUI()` 方法更新 ListView 中的数据。 在这个方法中,还涉及到了一些 Android 的基本操作,如从 `EditText` 中读取用户输入的信息、将信息存储到 `ContentValues` 对象中、使用 `insertWithOnConflict()` 方法将数据插入到数据库中、使用 `updateUI()` 方法更新 ListView 中的数据等等。
阅读全文

相关推荐

//课程列表显示界面 public class Course_List extends AppCompatActivity { RecyclerView NewsRecyclerView; NewsAdapter newsAdapter; List<NewsItem> mData; //数据库类全局变量 private CourseDBHelper mHelper; //构建一个courseDBHelper,并且调用其中的insert方法 //在activity中,onCreate执行结束后执行onStart(onStart和onStop一般成对出现) @Override protected void onStart() { //获得一个CourseDBHelper封装工具类的一个对象(实例)(mHelper为全局变量) mHelper = CourseDBHelper.getInstance(this); mHelper.openReadLink(); mHelper.openWriteLink(); super.onStart();} @Override protected void onStop() { super.onStop(); mHelper.closeLink();} @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_course_list); NewsRecyclerView = findViewById(R.id.news_rv); mData = new ArrayList<>(); String tvv1,tvv2,tvv3; List<Course_field> testList = mHelper.selectAllcourse(); if (testList != null && !testList.isEmpty()) { Course_field course = testList.get(1); // 获取第一条记录 tvv1 = (course.recorder_title != null ? course.recorder_title : ""); tvv2 = (course.recorder_time != null ? course.recorder_time : ""); tvv3 = (course.recorder_text != null ? course.recorder_text : ""); mData.add(new NewsItem(tvv1,tvv2,tvv3,R.drawable.touxiang)); } //适配器ini和设置 newsAdapter = new NewsAdapter(this,mData); NewsRecyclerView.setAdapter(newsAdapter); NewsRecyclerView.setLayoutManager(new LinearLayoutManager(this)); } } 在以上这段代码中,加上List<Course_field> testList = mHelper.selectAllcourse();这段代码不会报错,但是在Android studio中的虚拟机运行app后程序就会闪退,并且在此处加上断点调试后得出java.lang.RuntimeException: Unable to start activity ComponentInfo{com.examp.study.Course_List}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List 报错代码

课程设计报告:本地音乐播放器应用开发 摘要 本课程设计基于Android Studio平台,采用Java语言开发了一款功能完整的本地音乐播放器。系统采用MVC架构设计,通过四大组件协同工作,实现了音乐播放、进度控制、后台服务等核心功能。其中,Model层以硬编码方式存储三首音乐数据(空山野马、半点心、Shanghaivania),使用MediaPlayer类处理音频解码与播放控制;View层结合XML布局与自定义BaseAdapter,构建了包含唱片动画、进度条和播放控制按钮的交互界面;Controller层通过Service管理后台播放状态,利用Handler机制更新UI,并采用绑定服务机制实现组件间通信。 技术亮点: (1)后台播放服务:利用Service组件实现音乐后台持续播放,支持锁屏控制,解决了Activity生命周期对播放状态的影响。 (2)动态进度同步:通过Handler每500ms获取MediaPlayer当前位置,结合SeekBar实现进度实时显示与手动调节。 (3)界面动画效果:使用ObjectAnimator实现专辑封面360°旋转动画,旋转速度与音乐播放状态同步。 (4)模块化设计:通过Fragment实现音乐列表与收藏界面的模块化切换。 系统严格遵循Android开发规范,解决了媒体资源释放、多线程同步等技术难点。测试显示,系统在Android 8.0至13.0设备上稳定运行,内存占用峰值35MB,音频解码延迟小于0.2秒。 关键词:MusicService;ObjectAnimator;SeekBar;Fragment;后台播放;唱片动画 1. 前言 1.1 课题背景 随着智能手机的普及,音乐播放器成为用户日常娱乐的重要工具。传统系统播放器功能单一,无法满足个性化需求。本项目开发的本地音乐播放器,通过自定义界面和功能优化,提供更佳的用户体验。 1.2 研究意义及目的 研究意义: 实践Android多媒体开发核心技术(MediaPlayer、Service) 探索MVC架构在移动应用中的实现 研究用户交互设计原则与动画实现 形成可复用的多媒体应用开发方案 研究目的: 实现具备以下特性的音乐播放器: 支持三首本地音乐播放控制 动态进度显示与跳转 后台持续播放能力 专辑封面旋转动画 模块化界面切换 2. 软件开发环境 环境要素 配置说明 开发工具 Android Studio 2023.1.1 构建工具 Gradle 8.0 开发语言 Java 17 + XML 目标API级别 Android 8.0(API 26) - Android 13(API 33) 测试设备 Pixel 6 Pro (API 33) 3. 系统需求分析 3.1 可行性分析 技术可行性:MediaPlayer+Service成熟方案 社会可行性:满足基础音乐播放需求 3.2 系统需求 功能需求: 三首音乐列表展示(ListView) 播放控制(播放/暂停/继续) 进度控制(SeekBar) 唱片旋转动画 性能指标: 响应时间≤0.5s 内存占用≤50MB 支持后台播放 3.3 系统功能结构图 text 音乐播放器系统 ├── 用户界面 │ ├── 主界面 (MainActivity) │ ├── 播放界面 (MusicActivity) │ └── 收藏界面 (Fragment) ├── 核心功能 │ ├── 播放控制 (MediaPlayer) │ ├── 进度同步 (Handler) │ └── 后台服务 (MusicService) └── 数据管理 ├── 音乐数据 (硬编码) └── 播放状态 4. 系统设计 4.1 用户界面实现 4.1.1 动态布局 主界面布局 (activity_main.xml): xml <TextView android:text="我喜欢的音乐"/> <TextView android:id="@+id/menu1" android:text="歌曲"/> <TextView android:id="@+id/menu2" android:text="收藏"/> <FrameLayout android:id="@+id/content"/> 音乐列表项 (item_layout.xml): xml <RelativeLayout> <ImageView android:id="@+id/iv"/> <TextView android:id="@+id/item_name"/> </RelativeLayout> 4.1.2 交互动画 专辑封面旋转实现: java ObjectAnimator animator = ObjectAnimator.ofFloat( iv_music, "rotation", 0f, 360f ); animator.setDuration(10000); animator.setInterpolator(new LinearInterpolator()); animator.setRepeatCount(-1); 4.2 核心功能模块 4.2.1 音乐播放控制 播放指定位置音乐: java // MusicService.java public void play(int position) { Uri uri = Uri.parse("android.resource://" + getPackageName() + "/raw/music" + position); player = MediaPlayer.create(context, uri); player.start(); } 4.2.2 进度同步 定时更新进度: java timer.schedule(new TimerTask() { public void run() { Bundle bundle = new Bundle(); bundle.putInt("duration", player.getDuration()); bundle.putInt("current", player.getCurrentPosition()); handler.sendMessage(Message.obtain(handler, 0, bundle)); } }, 0, 500); 4.3 系统架构设计 4.3.1 Model层 音乐数据结构: java public class frag1 extends Fragment { public String[] name = {"空山野马", "半点心", "Shanghaivania"}; public static int[] icons = {R.drawable.music0, R.drawable.music1, R.drawable.music2}; } 播放状态管理: java public class MusicService extends Service { private MediaPlayer player; private Timer timer; } 4.3.2 View层 列表适配器实现: java class MyAdapter extends BaseAdapter { public View getView(int position, View convertView, ViewGroup parent) { View view = LayoutInflater.from(context) .inflate(R.layout.item_layout, parent, false); ((TextView)view.findViewById(R.id.item_name)).setText(songs[position]); ((ImageView)view.findViewById(R.id.iv)).setImageResource(icons[position]); return view; } } 4.3.3 Controller层 服务绑定机制: java public class MusicActivity extends AppCompatActivity { private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { musicControl = (MusicService.MusicControl) service; } }; } 5. 总结与展望 5.1 实现功能 三首本地音乐播放控制 进度精确管理(秒级) 后台持续播放 专辑封面旋转动画 模块化界面切换 5.2 技术收获 掌握MediaPlayer生命周期管理 理解Service绑定机制 熟练Handler线程通信 实践Fragment模块化开发 5.3 改进方向 功能扩展: 增加本地音乐文件扫描 实现播放列表管理 添加均衡器音效设置 体验优化: 支持歌词同步显示 添加睡眠定时功能 架构升级: 引入Room数据库 采用ViewModel管理状态 核心代码实现 主界面控制 (MainActivity.java): java public class MainActivity extends AppCompatActivity implements View.OnClickListener { protected void onCreate(Bundle savedInstanceState) { // 初始化Fragment管理器 fm = getSupportFragmentManager(); ft = fm.beginTransaction(); ft.replace(R.id.content, new frag1()); ft.commit(); } public void onClick(View v) { ft = fm.beginTransaction(); if (v.getId() == R.id.menu1) { ft.replace(R.id.content, new frag1()); // 歌曲列表 } else if (v.getId() == R.id.menu2) { ft.replace(R.id.content, new frag2()); // 收藏界面 } ft.commit(); } } 播放服务 (MusicService.java): java public class MusicService extends Service { class MusicControl extends Binder { public void play(int position) { Uri uri = Uri.parse("android.resource://" + getPackageName() + "/raw/music" + position); player = MediaPlayer.create(context, uri); player.start(); startProgressTracking(); } } private void startProgressTracking() { timer = new Timer(); timer.schedule(new TimerTask() { public void run() { Message msg = new Message(); Bundle bundle = new Bundle(); bundle.putInt("duration", player.getDuration()); bundle.putInt("current", player.getCurrentPosition()); handler.sendMessage(msg); } }, 0, 500); } } 歌曲列表 (frag1.java): java public class frag1 extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { listView.setOnItemClickListener((parent, view, position, id) -> { Intent intent = new Intent(getActivity(), MusicActivity.class); intent.putExtra("name", name[position]); intent.putExtra("position", position); startActivity(intent); }); return view; } } 结论 本系统成功实现了音乐播放器的核心功能,采用模块化设计和规范的Android组件使用方式,为后续功能扩展奠定了良好基础。项目代码结构清晰,功能完整,符合课程设计要求。package com.example.myapplication; import static com.example.myapplication.R.*; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { //创建需要用到的控件的变量 private TextView tv1,tv2; private FragmentManager fm; private FragmentTransaction ft; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定控件 tv1=(TextView)findViewById(R.id.menu1); tv2=(TextView)findViewById(R.id.menu2); //设置监听器,固定写法 tv1.setOnClickListener(this); tv2.setOnClickListener(this); //若是继承FragmentActivity,fm=getFragmentManger(); fm=getSupportFragmentManager(); //fm可以理解为Fragment显示的管理者,ft就是它的改变者 ft=fm.beginTransaction(); //默认情况下就显示frag1 ft.replace(R.id.content,new frag1()); //提交改变的内容 ft.commit(); } @Override //控件的点击事件 public void onClick(View v) { ft = fm.beginTransaction(); int id = v.getId(); if (id == R.id.menu1) { ft.replace(R.id.content, new frag1()); } else if (id == R.id.menu2) { ft.replace(R.id.content, new frag2()); } ft.commit(); } }package com.example.myapplication; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import android.animation.ObjectAnimator; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import static java.lang.Integer.parseInt; public class Music_Activity extends AppCompatActivity implements View.OnClickListener{ //进度条 private static SeekBar sb; private static TextView tv_progress,tv_total,name_song; //动画 private ObjectAnimator animator; private MusicService.MusicControl musicControl; private String name; private Intent intent1,intent2; private MyServiceConn conn; //记录服务是否被解绑,默认没有 private boolean isUnbind =false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_music); //获取从frag1传来的信息 intent1=getIntent(); init(); } private void init(){ //进度条上小绿点的位置,也就是当前已播放时间 tv_progress=(TextView)findViewById(R.id.tv_progress); //进度条的总长度,就是总时间 tv_total=(TextView)findViewById(R.id.tv_total); //进度条的控件 sb=(SeekBar)findViewById(R.id.sb); //歌曲名显示的控件 name_song=(TextView)findViewById(R.id.song_name); //绑定控件的同时设置点击事件监听器 findViewById(R.id.btn_play).setOnClickListener(this); findViewById(R.id.btn_pause).setOnClickListener(this); findViewById(R.id.btn_continue_play).setOnClickListener(this); findViewById(R.id.btn_exit).setOnClickListener(this); name=intent1.getStringExtra("name"); name_song.setText(name); //创建一个意图对象,是从当前的Activity跳转到Service intent2=new Intent(this,MusicService.class); conn=new MyServiceConn();//创建服务连接对象 bindService(intent2,conn,BIND_AUTO_CREATE);//绑定服务 //为滑动条添加事件监听,每个控件不同果然点击事件方法名都不同 sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { //这一行注解是保证API在KITKAT以上的模拟器才能顺利运行,也就是19以上 @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //进当滑动条到末端时,结束动画 if (progress==seekBar.getMax()){ animator.pause();//停止播放动画 } } @Override //滑动条开始滑动时调用 public void onStartTrackingTouch(SeekBar seekBar) { } @Override //滑动条停止滑动时调用 public void onStopTrackingTouch(SeekBar seekBar) { //根据拖动的进度改变音乐播放进度 int progress=seekBar.getProgress();//获取seekBar的进度 musicControl.seekTo(progress);//改变播放进度 } }); //声明并绑定音乐播放器的iv_music控件 ImageView iv_music=(ImageView)findViewById(R.id.iv_music); String position= intent1.getStringExtra("position"); //praseInt()就是将字符串变成整数类型 int i=parseInt(position); iv_music.setImageResource(frag1.icons[i]); //rotation和0f,360.0f就设置了动画是从0°旋转到360° animator=ObjectAnimator.ofFloat(iv_music,"rotation",0f,360.0f); animator.setDuration(10000);//动画旋转一周的时间为10秒 animator.setInterpolator(new LinearInterpolator());//匀速 animator.setRepeatCount(-1);//-1表示设置动画无限循环 } //handler机制,可以理解为线程间的通信,我获取到一个信息,然后把这个信息告诉你,就这么简单 public static Handler handler=new Handler(){//创建消息处理器对象 //在主线程中处理从子线程发送过来的消息 @Override public void handleMessage(Message msg){ Bundle bundle=msg.getData();//获取从子线程发送过来的音乐播放进度 //获取当前进度currentPosition和总时长duration int duration=bundle.getInt("duration"); int currentPosition=bundle.getInt("currentPosition"); //对进度条进行设置 sb.setMax(duration); sb.setProgress(currentPosition); //歌曲是多少分钟多少秒钟 int minute=duration/1000/60; int second=duration/1000%60; String strMinute=null; String strSecond=null; if(minute<10){//如果歌曲的时间中的分钟小于10 strMinute="0"+minute;//在分钟的前面加一个0 }else{ strMinute=minute+""; } if (second<10){//如果歌曲中的秒钟小于10 strSecond="0"+second;//在秒钟前面加一个0 }else{ strSecond=second+""; } //这里就显示了歌曲总时长 tv_total.setText(strMinute+":"+strSecond); //歌曲当前播放时长 minute=currentPosition/1000/60; second=currentPosition/1000%60; if(minute<10){//如果歌曲的时间中的分钟小于10 strMinute="0"+minute;//在分钟的前面加一个0 }else{ strMinute=minute+" "; } if (second<10){//如果歌曲中的秒钟小于10 strSecond="0"+second;//在秒钟前面加一个0 }else{ strSecond=second+" "; } //显示当前歌曲已经播放的时间 tv_progress.setText(strMinute+":"+strSecond); } }; //用于实现连接服务,比较模板化,不需要详细知道内容 class MyServiceConn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service){ musicControl=(MusicService.MusicControl) service; } @Override public void onServiceDisconnected(ComponentName name){ } } //判断服务是否被解绑 private void unbind(boolean isUnbind){ //如果解绑了 if(!isUnbind){ musicControl.pausePlay();//音乐暂停播放 unbindService(conn);//解绑服务 } } @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.btn_play) { //播放按钮点击事件 String position = intent1.getStringExtra("position"); int i = parseInt(position); musicControl.play(i); animator.start(); } else if (id == R.id.btn_pause) { //暂停按钮点击事件 musicControl.pausePlay(); animator.pause(); } else if (id == R.id.btn_continue_play) { //继续播放按钮点击事件 musicControl.continuePlay(); animator.start(); } else if (id == R.id.btn_exit) { //退出按钮点击事件 unbind(isUnbind); isUnbind = true; finish(); } } @Override protected void onDestroy(){ super.onDestroy(); unbind(isUnbind);//解绑服务 } }package com.example.myapplication; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.net.Uri; import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.os.Message; import java.util.Timer; import java.util.TimerTask; //这是一个Service服务类 public class MusicService extends Service { //声明一个MediaPlayer引用 private MediaPlayer player; //声明一个计时器引用 private Timer timer; //构造函数 public MusicService() {} @Override public IBinder onBind(Intent intent){ return new MusicControl(); } @Override public void onCreate(){ super.onCreate(); //创建音乐播放器对象 player=new MediaPlayer(); } //添加计时器用于设置音乐播放器中的播放进度条 public void addTimer(){ //如果timer不存在,也就是没有引用实例 if(timer==null){ //创建计时器对象 timer=new Timer(); TimerTask task=new TimerTask() { @Override public void run() { if (player==null) return; int duration=player.getDuration();//获取歌曲总时长 int currentPosition=player.getCurrentPosition();//获取播放进度 Message msg= Music_Activity.handler.obtainMessage();//创建消息对象 //将音乐的总时长和播放进度封装至bundle中 Bundle bundle=new Bundle(); bundle.putInt("duration",duration); bundle.putInt("currentPosition",currentPosition); //再将bundle封装到msg消息对象中 msg.setData(bundle); //最后将消息发送到主线程的消息队列 Music_Activity.handler.sendMessage(msg); } }; //开始计时任务后的5毫秒,第一次执行task任务,以后每500毫秒(0.5s)执行一次 timer.schedule(task,5,500); } } //Binder是一种跨进程的通信方式 class MusicControl extends Binder{ public void play(int i){//String path Uri uri=Uri.parse("android.resource://"+getPackageName()+"/raw/"+"music"+i); try{ //重置音乐播放器 player.reset(); //加载多媒体文件 player=MediaPlayer.create(getApplicationContext(),uri); player.start();//播放音乐 addTimer();//添加计时器 }catch(Exception e){ e.printStackTrace(); } } //下面的暂停继续和退出方法全部调用的是MediaPlayer自带的方法 public void pausePlay(){ player.pause();//暂停播放音乐 } public void continuePlay(){ player.start();//继续播放音乐 } public void seekTo(int progress){ player.seekTo(progress);//设置音乐的播放位置 } } //销毁多媒体播放器 @Override public void onDestroy(){ super.onDestroy(); if(player==null) return; if(player.isPlaying()) player.stop();//停止播放音乐 player.release();//释放占用的资源 player=null;//将player置为空 } }package com.example.myapplication; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import androidx.fragment.app.Fragment; public class frag1 extends Fragment { private View view; //创建歌曲的String数组和歌手图片的int数组 public String[] name={"空山野马","半点心","Shanghaivania"}; public static int[] icons={R.drawable.music0,R.drawable.music1,R.drawable.music2}; @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ //绑定布局,只不过这里是用inflate()方法 view=inflater.inflate(R.layout.music_list,null); //创建listView列表并且绑定控件 ListView listView=view.findViewById(R.id.lv); //实例化一个适配器 MyBaseAdapter adapter=new MyBaseAdapter(); //列表设置适配器 listView.setAdapter(adapter); //列表元素的点击监听器 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //创建Intent对象,参数就是从frag1跳转到MusicActivity Intent intent=new Intent(frag1.this.getContext(), Music_Activity.class); //将歌曲名和歌曲的下标存入Intent对象 intent.putExtra("name",name[position]); intent.putExtra("position",String.valueOf(position)); //开始跳转 startActivity(intent); } }); return view; } //这里是创建一个自定义适配器,可以作为模板 class MyBaseAdapter extends BaseAdapter{ @Override public int getCount(){return name.length;} @Override public Object getItem(int i){return name[i];} @Override public long getItemId(int i){return i;} @Override public View getView(int i ,View convertView, ViewGroup parent) { //绑定好VIew,然后绑定控件 View view=View.inflate(frag1.this.getContext(),R.layout.item_layout,null); TextView tv_name=view.findViewById(R.id.item_name); ImageView iv=view.findViewById(R.id.iv); //设置控件显示的内容,就是获取的歌曲名和歌手图片 tv_name.setText(name[i]); iv.setImageResource(icons[i]); return view; } } }package com.example.myapplication; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; public class frag2 extends Fragment { //创建一个View private View zj; //显示布局 public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { zj = inflater.inflate(R.layout.frag2_layout, null); return zj; } }<?xml version="1.0" encoding="utf-8"?> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="我喜欢的音乐" android:textSize="35dp"/> <TextView android:id="@+id/menu1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="歌曲" android:textSize="25dp"/> <TextView android:id="@+id/menu2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="收藏" android:textSize="25dp"/> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9"> </FrameLayout> <?xml version="1.0" encoding="utf-8"?> <ImageView android:id="@+id/iv_music" android:layout_width="240dp" android:layout_height="240dp" android:layout_gravity="center_horizontal" android:layout_margin="15dp" android:src="@drawable/music0"/> <TextView android:id="@+id/song_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="歌曲名" android:textSize="20sp"/> <SeekBar android:id="@+id/sb" android:layout_width="match_parent" android:layout_height="wrap_content" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="8dp" android:paddingRight="8dp"> <TextView android:id="@+id/tv_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00:00"/> <TextView android:id="@+id/tv_total" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="00:00"/> </RelativeLayout> <Button android:id="@+id/btn_play" android:layout_width="0dp" android:layout_height="40dp" android:layout_margin="8dp" android:layout_weight="1" android:background="@drawable/btn_bg_selector" android:text="播放音乐"/> <Button android:id="@+id/btn_pause" android:layout_width="0dp" android:layout_height="40dp" android:layout_margin="8dp" android:layout_weight="1" android:background="@drawable/btn_bg_selector" android:text="暂停播放"/> <Button android:id="@+id/btn_continue_play" android:layout_width="0dp" android:layout_height="40dp" android:layout_margin="8dp" android:layout_weight="1" android:background="@drawable/btn_bg_selector" android:text="继续播放"/> <Button android:id="@+id/btn_exit" android:layout_width="0dp" android:layout_height="40dp" android:layout_margin="8dp" android:layout_weight="1" android:background="@drawable/btn_bg_selector" android:text="退出"/> <?xml version="1.0" encoding="utf-8"?> <ImageView android:id="@+id/zj" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg2"/> <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <ImageView android:id="@+id/iv" android:layout_width="40dp" android:layout_height="40dp" android:layout_centerVertical="true"/> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_toRightOf="@+id/iv" android:layout_centerVertical="true"> <TextView android:id="@+id/item_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="歌曲" android:textSize="15sp" android:textColor="#000000"/> </RelativeLayout> </RelativeLayout> <?xml version="1.0" encoding="utf-8"?> 再根据我给的代码在重写一份并且进行修改,每个部分的标题要进行改变

package com.example.text; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.media.projection.MediaProjectionManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings; import android.util.Log; import android.view.View; import android.widget.Button; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.example.text.AI.FloatingBallService; import com.example.text.Class.goods; import com.example.text.SQL.DatabaseHelper; import com.example.text.SQL.Goods.Goods; import com.example.text.SQL.Goods.GoodsItem; import com.example.text.utils.Http; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; import android.Manifest; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final int REQUEST_STORAGE_PERMISSION = 1; private DatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // EdgeToEdge.enable(this); setContentView(R.layout.activity_main); // 检查存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 权限未开启,请求用户授权 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION); } else { // 权限已开启,继续执行创建数据库的操作 createDatabase(); } if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); return; // 如果没有权限,直接退出服务 } //创建数据库 dbHelper = new DatabaseHelper(this); Intent captureIntent = ((MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE)) .createScreenCaptureIntent(); startActivityForResult(captureIntent, 101); Button button=findViewById(R.id.button2); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (Settings.canDrawOverlays(MainActivity.this)) { startService(new Intent(MainActivity.this, FloatingBallService.class)); // ✅ 自动退到后台(模拟 Home 键) Intent homeIntent = new Intent(Intent.ACTION_MAIN); homeIntent.addCategory(Intent.CATEGORY_HOME); homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(homeIntent); } else { // 引导用户授权 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivity(intent); } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 101 && resultCode == RESULT_OK) { Intent service = new Intent(this, FloatingBallService.class); service.putExtra("code", resultCode); service.putExtra("data", data); startService(service); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_STORAGE_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户授予了权限,继续执行创建数据库的操作 createDatabase(); } else { // 用户拒绝了权限,提示用户 Log.e("MainActivity", "存储权限被拒绝"); Toast.makeText(this, "存储权限被拒绝,无法继续操作", Toast.LENGTH_SHORT).show(); } } } private void createDatabase() { // 创建数据库 dbHelper = new DatabaseHelper(this); Log.d("MainActivity", "数据库创建成功"); } } 2025-07-18 09:17:38.018 2569-2630 MiEvent system_server E report:open miev fail, EventId 901003004 -t 1752801458 -paraList {"ActivityName":"com.example.text.MainActivity","Duration":10126,"PackageName":"com.example.text"} ---------------------------- PROCESS ENDED (10638) for package com.example.text ---------------------------- 2025-07-18 09:17:40.058 4285-5371 ActivityManagerWrapper com.miui.home E getRecentTasks: mainTaskId=10275 userId=0 windowMode=1 baseIntent=Intent { act=android.intent.action.MAIN flag=270532608 cmp=ComponentInfo{com.example.text/com.example.text.MainActivity} } 2025-07-18 09:17:40.416 1425-1425 vendor.qti...al-service ven...qti.hardware.perf-hal-service E ExtendedPerfBoost: extended_perfboost_verification() 738: Ok, set boost params. hintid=4225 hinttype=1 prio=3, clientpid=2569 packagename=com.example.text params=boost:1 cpu0:1804800 cpu4:2496000 cpu7:2592000 cpumask:ff 2025-07-18 09:17:40.459 10872-10872 Zygote usap64 E process_name_ptr:10872 com.example.text 2025-07-18 09:17:40.523 27603-3228 SuggestManager com.miui.securitycenter.remote E openApp name = com.example.text 2025-07-18 09:17:40.534 27603-28288 AntiFraud com.miui.securitycenter.remote E hookDetectUnsafeAppStart error, android.content.pm.PackageManager$NameNotFoundException: com.example.text at android.app.ApplicationPackageManager.getApplicationInfoAsUser(ApplicationPackageManager.java:515) at android.app.ApplicationPackageManager.getApplicationInfo(ApplicationPackageManager.java:498) at android.app.ApplicationPackageManager.getApplicationInfo(ApplicationPackageManager.java:492) at w2.b.f(Unknown Source:12) at w2.b$c.onForegroundInfoChanged(Unknown Source:21) at com.miui.gamebooster.mutiwindow.b$a.onForegroundInfoChanged(Unknown Source:152) at miui.process.IForegroundInfoListener$Stub.onTransact(IForegroundInfoListener.java:86) at android.os.Binder.execTransactInternal(Binder.java:1351) at android.os.Binder.execTransact(Binder.java:1282) 2025-07-18 09:17:40.546 8279-10833 SuggestManager com.miui.securitycenter.remote E openApp name = com.example.text 2025-07-18 09:17:40.549 4285-5371 ActivityManagerWrapper com.miui.home E getRecentTasks: mainTaskId=10276 userId=0 windowMode=1 baseIntent=Intent { act=android.intent.action.MAIN flag=268435456 cmp=ComponentInfo{com.example.text/com.example.text.MainActivity} } ---------------------------- PROCESS STARTED (10872) for package com.example.text ----------------------------

package com.example.text.SQL; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "example.db"; private static final int DATABASE_VERSION = 1; private static final String SQL_FILE_NAME = "fields.sql"; private Context context; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); System.out.println("执行了?"); this.context=context; } @Override public void onCreate(SQLiteDatabase db) { // 读取并执行 SQL 文件中的语句 Log.d("DatabaseHelper", "正在创建数据库表..."); try { executeSqlFile(db, SQL_FILE_NAME); Log.d("DatabaseHelper", "数据库表创建成功。"); } catch (IOException e) { Log.e("DatabaseHelper", "创建数据库表时发生错误: " + e.getMessage(), e); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.d("DatabaseHelper", "正在升级数据库,从版本 " + oldVersion + " 到 " + newVersion); try { // 删除旧表 db.execSQL("DROP TABLE IF EXISTS sz_user"); db.execSQL("DROP TABLE IF EXISTS cu_customer_chex"); db.execSQL("DROP TABLE IF EXISTS cu_customer"); db.execSQL("DROP TABLE IF EXISTS cu_customertype"); db.execSQL("DROP TABLE IF EXISTS sz_region"); db.execSQL("DROP TABLE IF EXISTS sz_department"); db.execSQL("DROP TABLE IF EXISTS sz_warehouse"); db.execSQL("DROP TABLE IF EXISTS sz_paytype"); db.execSQL("DROP TABLE IF EXISTS sz_goods"); db.execSQL("DROP TABLE IF EXISTS sz_goodsunit"); db.execSQL("DROP TABLE IF EXISTS sz_goodsimage"); db.execSQL("DROP TABLE IF EXISTS sz_visitline"); db.execSQL("DROP TABLE IF EXISTS sz_goodsprice"); db.execSQL("DROP TABLE IF EXISTS sz_user"); db.execSQL("DROP TABLE IF EXISTS sz_goodsclass"); db.execSQL("DROP TABLE IF EXISTS sz_pricesystem"); db.execSQL("DROP TABLE IF EXISTS sz_unit"); db.execSQL("DROP TABLE IF EXISTS cu_customerfieldsalegoods"); db.execSQL("DROP TABLE IF EXISTS kf_fieldsale"); db.execSQL("DROP TABLE IF EXISTS kf_fieldsaleitem"); db.execSQL("DROP TABLE IF EXISTS sv_docitem"); db.execSQL("DROP TABLE IF EXISTS exception_log"); db.execSQL("DROP TABLE IF EXISTS kf_serverdoc"); db.execSQL("DROP TABLE IF EXISTS cw_settleuppaytype"); db.execSQL("DROP TABLE IF EXISTS cw_settleup"); db.execSQL("DROP TABLE IF EXISTS cw_settleupitem"); db.execSQL("DROP TABLE IF EXISTS cw_othersettleupitem"); db.execSQL("DROP TABLE IF EXISTS sz_account"); db.execSQL("DROP TABLE IF EXISTS visitcustomerjobimage"); db.execSQL("DROP TABLE IF EXISTS visitcustomer"); db.execSQL("DROP TABLE IF EXISTS visitcustomerjob"); db.execSQL("DROP TABLE IF EXISTS sz_visitjob"); db.execSQL("DROP TABLE IF EXISTS form_group"); db.execSQL("DROP TABLE IF EXISTS form"); // 重新创建表 onCreate(db); Log.d("DatabaseHelper", "数据库表升级成功。"); } catch (Exception e) { Log.e("DatabaseHelper", "升级数据库时发生错误: " + e.getMessage(), e); } } /** * 从 assets 目录中读取 SQL 文件并执行 * * @param db SQLiteDatabase 实例 * @param fileName SQL 文件名 * @throws IOException 如果读取文件时发生错误 */ private void executeSqlFile(SQLiteDatabase db, String fileName) throws IOException { InputStream inputStream = null; BufferedReader reader = null; try { inputStream = context.getAssets().open(fileName); reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder sql = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sql.append(line).append("\n"); } Log.d("DatabaseHelper", "SQL 文件内容: " + sql.toString()); db.execSQL(sql.toString()); Log.d("DatabaseHelper", "SQL 文件执行成功: " + fileName); } catch (IOException e) { Log.e("DatabaseHelper", "执行 SQL 文件时发生错误: " + e.getMessage(), e); } finally { if (reader != null) { reader.close(); } if (inputStream != null) { inputStream.close(); } } } /** * 获取数据库中的所有表名 * * @return 数据库中的表名列表 */ public List<String> getTableNames() { List<String> tableNames = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = null; try { cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null); if (cursor != null) { while (cursor.moveToNext()) { tableNames.add(cursor.getString(0)); } } } catch (Exception e) { Log.e("DatabaseHelper", "获取表名时发生错误: " + e.getMessage(), e); } finally { if (cursor != null) { cursor.close(); } db.close(); } return tableNames; } } CREATE TABLE IF NOT EXISTS "sz_user" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pinyin" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "cu_customer_chex"( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pinyin" TEXT(50), "contactmoblie" TEXT(50), "address" TEXT(50), "settleterm" TEXT(50), "discountratio" TEXT(50), "promotionid" TEXT(50), "promotionname" TEXT(50), "pricesystemid" TEXT(50), "isavailable" TEXT(1), "iscustomer" TEXT(50), "issupplier" TEXT(50), "isusecustomerprice" TEXT(50), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "cu_customer" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pinyin" TEXT(50) , "orderno" INTEGER, "contact" TEXT(50), "contactmoblie" TEXT(50) , "telephone" TEXT(50) , "regionid" TEXT(50), "customertypeid" TEXT(50), "visitlineid" TEXT(50), "depositbank" TEXT(50), "bankingaccount" TEXT(50), "promotionid" TEXT(20), "promotionname" TEXT(50), "address" TEXT(50) , "settleterm" TEXT(50), "discountratio" TEXT(50), "pricesystemid" TEXT(1), "longitude" TEXT(20), "latitude" TEXT(20), "remark" TEXT(50), "isnew" TEXT(1), "isfinish" TEXT(1), "exhibitionterm" TEXT(5), "lastexhibition" TEXT(20), "isavailable" TEXT(1), "iscustomer" TEXT(50), "issupplier" TEXT(50), "isusecustomerprice" TEXT(1), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "cu_customertype" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pricesystemid" TEXT(50), "isavailable" TEXT(1), "iscustomer" TEXT(1), "issupplier" TEXT(1), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "sz_region" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pinyin" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "sz_department" ( "did" TEXT(50) NOT NULL, "dname" TEXT(50), "warehouseid" TEXT(50), "warehousename" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY ("did") ); CREATE TABLE IF NOT EXISTS "sz_warehouse" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pinyin" TEXT(50), "istruck" TEXT(1), "isavailable" TEXT(1), PRIMARY KEY ("id") ); CREATE TABLE IF NOT EXISTS "sz_paytype" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY ("id") ); CREATE TABLE IF NOT EXISTS "sz_goods" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pinyin" TEXT(50), "barcode" TEXT(50), "salecue" TEXT(400), "specification" TEXT(50), "model" TEXT(50), "goodsclassid" TEXT(50), "goodsclassname" TEXT(50), "warehouseid" TEXT(50), "warehousename" TEXT(50), "stocknumber" DECIMAL(38,2), "bigstocknumber" TEXT(50), "getstocktime" TEXT(50), "isavailable" TEXT(1), "isusebatch" TEXT(1), "rank" INTEGER, "remark" TEXT(50), PRIMARY KEY ("id") ); CREATE TABLE IF NOT EXISTS "sz_goodsunit" ( "goodsid" TEXT(50) NOT NULL, "unitid" TEXT(50) NOT NULL, "unitname" TEXT(50) , "isbasic" TEXT(1), "isshow" TEXT(1), "ratio" DECIMAL(38,2), PRIMARY KEY ("goodsid", "unitid") ); CREATE TABLE IF NOT EXISTS "sz_goodsimage" ( "serialid" TEXT(50) NOT NULL, "goodsid" TEXT(50), "imagepath" TEXT(50), "isgot" TEXT(50), PRIMARY KEY ("serialid") ); CREATE TABLE IF NOT EXISTS "sz_visitline" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "sz_goodsprice" ( "goodsid" TEXT(50) NOT NULL, "unitid" TEXT(50) NOT NULL, "unitname" TEXT(50) , "pricesystemid" TEXT(50) NOT NULL, "pricesystemname" TEXT(50), "price" TEXT(50), PRIMARY KEY ("goodsid", "unitid", "pricesystemid") ); CREATE TABLE IF NOT EXISTS "sz_user" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pinyin" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "sz_goodsclass" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "pinyin" TEXT(50), "isavailable" TEXT(1), "parentgoodsclassid" TEXT(50), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "sz_pricesystem" ( "psid" TEXT(50) NOT NULL, "psname" TEXT(50), "pinyin" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY("psid") ); CREATE TABLE IF NOT EXISTS "sz_unit" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "cu_customerfieldsalegoods" ( "customerid" TEXT(50) NOT NULL, "goodsid" TEXT(50), "goodsthirdclassid" TEXT(50), "unitid" TEXT(50), "price" TEXT(50), "issale" TEXT(1), "lastnum" TEXT(50), "smallnum" DECIMAL(38,2), "assistnum" TEXT(50), "smallbignum" TEXT(50), "lastbuildtime" TEXT(50) ); CREATE TABLE IF NOT EXISTS "kf_fieldsale" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "customerid" nvarchar(100), "isnewcustomer" TEXT(1), "showid" nvarchar(100), "customername" TEXT(20), "departmentid" TEXT(20), "departmentname" TEXT(50), "warehouseid" TEXT(20), "warehousename" TEXT(50), "pricesystemid" TEXT(20), "promotionid" TEXT(50), "preference" nvarchar(100), "status" integer, "remark" TEXT(20), "xtremark" TEXT(20), "builderid" TEXT(20), "buildername" TEXT(20), "buildtime" TEXT(20), "printnum" TEXT(20), "mobile" TEXT(20), "paytype" TEXT(100) ); CREATE TABLE IF NOT EXISTS "kf_fieldsaleitem" ( "serialid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "fieldsaleid" INTEGER NOT NULL, "warehouseid" TEXT(20), "goodsid" TEXT(20), "saleunitid" TEXT(20), "salenum" DECIMAL(19,4), "saleprice" DECIMAL(19,4), "saleremark" TEXT(50), "cancelunitid" TEXT(20), "cancelnum" DECIMAL(19,4), "cancelprice" DECIMAL(19,4), "cancelremark" TEXT(50), "givenum" DECIMAL(19,4), "giveunitid" TEXT(20), "giveremark" TEXT(50), "exchangenum" DECIMAL(19,4), "exchangeunitid" TEXT(20), "exchangeremark" TEXT(50), "isprocessed" TEXT(20), "cancelbatchin" TEXT(20), "cancelproductiondatein" TEXT(20), "exchangebatchin" TEXT(20), "exchangeproductiondatein" TEXT(20), "giftgoodsid" TEXT(20), "giftgoodsname" TEXT(20), "giftunitid" TEXT(20), "giftunitname" TEXT(20), "giftnum" DECIMAL(19,4), "giftremark" TEXT(50), "promotiontype" TEXT(20), "ispromotion" TEXT(1), "isexhibition" TEXT(1) ); CREATE TABLE IF NOT EXISTS "sv_docitem" ( "svid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "showid" TEXT(20), "deleteinitem" TEXT(20), "deleteitem" TEXT(20), "doc" TEXT(100), "item" TEXT(100), "doctype" TEXT(20), "paytype" TEXT(100) ); CREATE TABLE IF NOT EXISTS "exception_log" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "accountset" TEXT(50), "userid" TEXT(50), "username" TEXT(50), "deviceid" TEXT(50), "model" TEXT(50), "versionname" TEXT(50), "message" TEXT(50), "data" TEXT(50), "log" TEXT(50), "datetime" TEXT(50), "isupdata" INTEGER(1) ); CREATE TABLE IF NOT EXISTS "kf_serverdoc"( "docid" TEXT(50), "docshowid" TEXT(50), "customerid" TEXT(10), "customername" TEXT(20), "doctype" TEXT(10), "doctypename" TEXT(20), "receivableamount" REAL(19,4), "receivedamount" REAL(19,4), "leftamount" REAL(19,4), "doctime" TEXT(50), PRIMARY KEY("docid","docshowid") ); CREATE TABLE IF NOT EXISTS "cw_settleuppaytype" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "settleupid" INTEGER, "paytypeid" TEXT(50), "paytypename" TEXT(50), "amount" DECIMAL(19,4), "remark" TEXT(400) ); CREATE TABLE IF NOT EXISTS "sz_paytype" ( "id" TEXT(50) NOT NULL, "name" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY ("id") ); CREATE TABLE IF NOT EXISTS "cw_settleup" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "departmentid" TEXT(50), "departmentname" TEXT(50), "objectid" TEXT(50), "isnewobject" TEXT(1), "objectname" TEXT(50), "objectoperator" TEXT(50), "preference" REAL(19,4), "issubmit" TEXT(1), "remark" TEXT(200), "builderid" TEXT(50), "buildername" TEXT(50), "buildtime" TEXT, "type" TEXT(4) ); CREATE TABLE IF NOT EXISTS "cw_settleupitem" ( "serialid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "settleupid" INTEGER, "doctime" TEXT, "docid" INTEGER, "docshowid" TEXT(20), "doctype" TEXT(1), "doctypename" TEXT(20), "receivableamount" TEXT(20), "receivedamount" TEXT(20), "leftamount" TEXT(20), "isselect" TEXT(1), "thisamount" DECIMAL(19,4) ); CREATE TABLE IF NOT EXISTS "cw_othersettleupitem" ( "serialid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "othersettleupid" INTEGER, "accountid" TEXT(50), "accountname" TEXT(50), "amount" DECIMAL(19,4) ); CREATE TABLE IF NOT EXISTS "sz_account"( "aid" TEXT(50) NOT NULL, "aname" TEXT(50), "pinyin" text(50), "parentaccountid" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY("aid") ); CREATE TABLE IF NOT EXISTS "visitcustomerjobimage" ( "serialid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "visitcustomerjobid" INTEGER, "issignature" TEXT(1), "imagepath" TEXT(100), "remark" TEXT(400) ); CREATE TABLE IF NOT EXISTS "visitcustomer" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "customerid" TEXT(50) NOT NULL, "isnewcustomer" TEXT(1), "customername" TEXT(50) NOT NULL, "mobile" TEXT(50), "fieldsaleid" TEXT(50), "departmentid" TEXT(50), "departmentname" TEXT(50), "status" TEXT(1) NOT NULL, "remark" TEXT(400), "performerid" TEXT(50), "performername" TEXT(50), "entertime" TEXT(50), "leavetime" TEXT(50), "longitude" TEXT(50), "latitude" TEXT(50), "address" TEXT(50) ); CREATE TABLE IF NOT EXISTS "visitcustomerjob" ( "serialid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "visitcustomerid" TEXT NOT NULL, "job" TEXT(100), "performinfo" TEXT(1000), "performtime" TEXT(50) ); CREATE TABLE IF NOT EXISTS "sz_visitjob" ( "id" TEXT(50), "name" TEXT(50), "isavailable" TEXT(1), PRIMARY KEY ("id") ); create table if not exists "form_group"( "id" text(50), "name" text(50), primary key("id") ); create table if not exists "form"( "id" text(50), "name" text(50), "groupid" text(50), "isshow" text(1), "isstar" text(1), "tag" text(1), "condact" text(50), "formact" text(50), primary key("id") ); 只创建了第一个表

项目创建后有如下错误: AndroidManifest.xml文件的错误: 无法解析符号 '@style/Theme.FloatingSearchApp' READ_EXTERNAL_STORAGE is deprecated (and is not granted) when targeting Android 13+. If you need to query or interact with MediaStore or media files on the shared storage, you should instead use one or more new storage permissions: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO or READ_MEDIA_AUDIO. Redundant label can be removed DatabaseHelper.kt文件的错误: 应为 <database name> 或 <defined table name>,得到 '$' Value must be ≥ 0 but getColumnIndex can be -1 Parameter 'question' is never used FloatingWindowService.kt文件的错误: Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element) 'TYPE_PHONE: Int' is deprecated. Deprecated in Java onTouch should call View#performClick when a click is detected Do not concatenate text displayed with setText. Use resource string with placeholders. String literal in setText can not be translated. Use Android resources instead. Variable 'answer' is never used Do not concatenate text displayed with setText. Use resource string with placeholders. String literal in setText can not be translated. Use Android resources instead. MainActivity.kt文件的错误: Unresolved reference: activity_main This declaration overrides deprecated member but not marked as deprecated itself. Please add @Deprecated annotation or suppress. See https://youtrack.jetbrains.com/issue/KT-47902 for details TextRecognizer.kt文件的错误: No value passed for parameter 'options' 'getter for defaultDisplay: Display!' is deprecated. Deprecated in Java 'getMetrics(DisplayMetrics!): Unit' is deprecated. Deprecated in Java Parameter 'context' is never used floating_window.xml文件的错误: Hardcoded string "问题将显示在这里", should use @string resource Hardcoded string "答案将显示在这里", should use @string resource

最新推荐

recommend-type

【电子设计竞赛】2018年电子设计大赛A题失真度分析仪:从理论到代码实现全解析

内容概要:本文深入解析了2018年电子设计大赛A题——失真度分析仪的设计与实现。文章首先介绍了题目的背景与要求,包括谐波计算、数据显示和无线传输三个核心任务。接着详细阐述了解题思路,涵盖信号采集(ADC)、FFT分析、失真度计算、显示与无线传输等方面的技术要点。硬件设计部分重点讲解了信号调理电路、ADC电路、显示电路和无线传输电路的具体实现方法。最后提供了软件代码实现,包括ADC采样、FFT计算、失真度计算、数据显示与无线传输的代码示例。; 适合人群:对电子设计感兴趣的初学者、电子工程专业的学生及有一定基础的电子爱好者。; 使用场景及目标:①帮助读者理解失真度分析仪的工作原理和技术实现;②为准备参加类似电子设计竞赛的人提供参考;③通过实例代码加深对电子电路、信号处理和编程的理解。; 其他说明:本文不仅涵盖了理论知识,还提供了详细的代码实现,有助于读者在实践中学习和掌握相关技能。同时,文中提到的一些优化方向也为进一步探索电子设计提供了思路。
recommend-type

Matlab实现高斯烟羽模型源码:高效且精确的大气扩散模拟工具 Matlab

使用Matlab实现高斯烟羽模型的方法及其应用。首先解释了高斯烟羽模型的基本原理,特别是核心算法部分,包括参数校验、扩散系数的经验公式以及烟羽公式的具体实现。接着讨论了可视化部分,展示了如何利用Matlab进行空间网格生成、浓度分布的动态剖面生成和伪彩色渲染。此外,还探讨了扩散系数对模型精度的影响,并提供了不同大气稳定度条件下的系数调整方法。最后提到了模型验证过程中的一些物理规律和注意事项。 适合人群:环境科学、大气物理学及相关领域的研究人员和技术人员,尤其是那些需要进行大气污染物扩散模拟的人群。 使用场景及目标:适用于化工园区的大气扩散模拟项目,特别是在应急响应场景中预测污染物的扩散情况。目标是帮助用户理解和掌握高斯烟羽模型的实现方法,提高大气扩散模拟的效率和准确性。 其他说明:文中提到的代码片段可以直接用于实际项目中,但需要注意参数的选择和调整,以确保模型的适用性和可靠性。同时,在使用该模型时,应当引用相关文献,尊重知识产权。
recommend-type

Python打造的Slaee管理系统升级版发布

由于提供的文件信息中,文件名《基于python的slaee管理系统 (15).zip》与描述《基于python的slaee管理系统 (15).zip》相同,并且给出的压缩包文件名称列表中只有一个文件《基于python的slaee管理系统 (14).zip》,该信息表明我们正在讨论两个不同版本的Python系统管理软件的压缩包。以下知识点将根据这些信息详细展开: 知识点一:Python编程语言基础 Python是一种高级编程语言,以其简洁的语法和强大的库支持而闻名。它是解释型语言,具有动态类型系统和垃圾回收功能,适用于多种编程范式,包括面向对象、命令式、函数式和过程式编程。Python广泛应用于系统管理、网络服务器、开发脚本、科学计算、数据挖掘和人工智能等领域。 知识点二:系统管理相关知识 系统管理指的是对计算机系统进行配置、监控和维护的过程,包括硬件资源、软件资源和数据资源的管理。在Python中,系统管理通常涉及操作系统级别的任务,如进程管理、文件系统管理、网络配置、系统日志监控等。Python的系统管理库(例如psutil、fabric、paramiko等)提供了丰富的API来简化这些任务。 知识点三:项目版本控制 从文件名《基于python的slaee管理系统 (14).zip》和《基于python的slaee管理系统 (15).zip》可以看出,这是一个项目在不同版本之间的迭代。版本控制是一种记录一个或多个文件随时间变化的方式,它允许用户可以回到特定版本。在软件开发中,版本控制非常重要,它有助于团队协作、代码合并、分支管理和错误跟踪。常见的版本控制系统包括Git、Subversion (SVN)、Mercurial等。 知识点四:打包与部署 提到“压缩包子文件”,这通常意味着文件已经被压缩打包成一个ZIP文件。在软件开发中,打包是为了便于文件传输、存档保存和分发。在Python项目中,打包也是部署过程的一部分。一个Python项目通常需要包含源代码、依赖关系、配置文件和安装脚本等。打包成ZIP文件后,可以通过各种方式部署到服务器上运行,如使用Fabric或Ansible等自动化部署工具。 知识点五:项目命名及版本命名规则 文件命名中的“基于python的slaee管理系统”表明这是一个与Python语言相关的系统管理项目。而数字“15”和“14”则代表着项目的版本号,这表明项目在持续发展,不同的数字代表了项目在不同时期的迭代。版本号的命名规则通常遵循语义化版本控制(SemVer),这种版本控制系统以 MAJOR.MINOR.PATCH 的形式表示版本号。 知识点六:文件压缩与解压缩技术 ZIP是一种常用的文件压缩格式,它通过减少文件大小来提高存储效率和传输速度。ZIP文件通常是无损压缩,意味着文件在压缩和解压缩的过程中不会丢失信息。Python标准库提供了zipfile模块,允许用户在Python程序中创建ZIP文件、读取ZIP文件内容、提取ZIP文件中的文件等操作。用户可以使用各种图形界面工具(如WinRAR、7-Zip)或命令行工具来处理ZIP文件。 总结以上内容,从文件信息中我们可以得知该内容涉及了Python编程语言、系统管理知识、版本控制、打包与部署、命名规则以及文件压缩技术等多方面的知识点。这些知识点对于理解和应用Python进行系统管理软件开发以及软件的版本迭代、打包与部署均具有重要意义。
recommend-type

深入解析PCB走线传输延时:关键因素与实用公式

# 1. PCB走线传输延时基础 在电子工程领域,尤其是在印刷电路板(PCB)设计中,走线传输延时是一个不可忽视的重要概念。传输延时主要指的是电信号通过PCB上的导电路径从源头传送到目的地所耗费的时间。本章将介绍PCB走线传输延时的基础知识点,为后续章节的深入探讨打下坚实的基础。 首先,了解什么是传输延时是至关重要的。简单来说,它反
recommend-type

gpio很弱是什么意思

<think>嗯,用户的问题是关于GPIO信号弱的概念及其影响。用户似乎对硬件或嵌入式系统有一定了解,但需要更深入的解释。从用户提到的"信号弱"来看,ta可能遇到了实际电路设计中的驱动能力问题,或者在学习GPIO原理时遇到了术语困惑。 用户引用了四篇资料,其中提到GPIO的模拟输入输出模式、施密特触发器的作用、上拉下拉电阻的配置,以及信号线串联电阻的作用。这些内容都与GPIO的驱动能力和信号质量相关。特别是引用[4]中提到的"信号线串联小电阻"和"低频电路不考虑反射",暗示用户可能正在处理实际电路中的信号完整性问题。 用户真正想知道的可能是:为什么我的GPIO输出无法正确驱动某个设备?或者
recommend-type

Python打造的Slaee管理系统升级版发布

标题中的“基于python的slaee管理系统”表明这是一个使用Python编程语言开发的系统。Python是一种广泛使用的高级编程语言,以其易读性和简洁的语法而闻名。SLAEE管理系统可能是指一个特定类型的管理软件,但由于没有给出缩写的完整解释,我们可以假设SLAEE可能是某机构或系统名称的缩写。 从标题和描述来看,存在一处笔误:“基于python的slaee管理系统 (19).zip”和“基于python的slaee管理系统 (18).zip”所指的似乎是同一软件系统,只是版本号不同。根据文件名称列表中的两个文件名,可以推断系统至少有两个版本,一个是版本18,一个是版本19。通常情况下,版本号的增加表示软件进行了更新或改进。 接下来,根据这些信息,我们可以阐述一些相关的知识点: 1. Python编程基础:Python是一种解释型、面向对象、高级编程语言。Python支持多种编程范式,包括过程式、面向对象和函数式编程。Python由于其简洁和易于学习的特性,被广泛应用于网络开发、数据分析、人工智能、机器学习和科学计算等领域。 2. 文件压缩与打包:文件压缩是将文件的大小减小以节省存储空间或网络传输时间的技术。常见的文件压缩格式包括ZIP、RAR、7Z等。文件打包通常指的是将多个文件或文件夹压缩成一个单独的文件。这在数据备份、软件分发和档案管理中非常常见。 3. 版本控制:在软件开发中,“版本”通常指软件的特定状态,版本号则用来标识这些状态。版本控制是一种记录文件、目录或集合随着时间变化的方式,以便将来可以检索特定版本。对于软件项目来说,版本控制是至关重要的,它不仅允许开发者追踪和管理代码的变化,而且还能帮助团队协作,解决冲突,并回滚到旧版本。 4. 软件管理系统的开发:一个软件管理系统可能是针对特定业务领域而设计的,它可能包括用户界面、数据库管理、业务逻辑处理、报告生成和其他许多功能。软件管理系统的开发通常涉及需求分析、系统设计、编程、测试和维护等多个阶段。 5. Python在软件开发中的应用:Python因为具有丰富的库和框架,被广泛用于开发各种类型的软件。例如,Django和Flask是用于Web开发的流行Python框架;而对于数据分析和数据科学任务,Pandas、NumPy和Matplotlib等库提供了强大的数据处理和可视化工具;对于机器学习和人工智能,TensorFlow、PyTorch等库使得复杂算法的实现变得更为简单。 6. 系统更新与维护:随着软件的使用和发展,需求可能会变化,新的问题可能会出现,所以软件系统需要定期进行更新和维护。软件更新可能包括修复已知问题、改进现有功能、增加新功能或优化性能。开发者需要评估是否需要为修复安全漏洞或提高系统性能而更新系统,以及更新之后对用户体验的影响。 由于文件名中只提到了“基于python的slaee管理系统”,没有提供该系统具体功能的详细描述,我们无法提供更加具体的技术知识点。如果需要分析系统的工作原理或具体的技术实现细节,还需要更多的信息。
recommend-type

【Keil-ARM编程艺术】:如何编写可维护且高效的代码

# 摘要 本文旨在为读者提供ARM微控制器编程和Keil开发环境的全面指南。第一章概览了ARM微控制
recommend-type

应用层协议概述

<think>首先,用户的问题是:“我想了解应用层协议的基本概念和常见类型 请问应用层协议简介 常见应用层协议概述”。这翻译成:“I want to understand the basic concepts of application layer protocols and common types. Please introduce application layer protocols and overview common application layer protocols.” 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式
recommend-type

Delphi 12 TeeChartVCLFMX控件包下载及功能介绍

标题中提到的"Delphi 12 控件之TeeChartVCLFMX-2024.40.rar"指的是Delphi 12版本中使用的TeeChartVCLFMX图表控件的特定版本(2024.40版本)。Delphi是由Embarcadero Technologies开发的一款流行的集成开发环境(IDE),专门用于使用Object Pascal和C++语言开发软件应用程序。该标题强调了Delphi 12环境下TeeChartVCLFMX控件的使用,这表明Delphi的图形用户界面(GUI)组件库中包含了一个专门用于创建复杂图表和图形的组件。 从描述中仅能得到的关于文件的名称是"TeeChartVCLFMX-2024.40.rar",这意味着文件是一个压缩包,具体包含了一个TeeChartVCLFMX的图表控件,版本号为2024.40。它可能包含了在Delphi 12版本中使用该图表控件所需的所有文件,包括库文件、二进制文件、文档等。 标签"delphi 控件"简单而直接地指出了该文件属于Delphi编程环境中的一个控件类别,表明了目标用户是Delphi开发者,他们通常使用这些控件来丰富他们的应用程序界面或增强应用程序的功能。 文件名称列表提供了关于TeeChartVCLFMX压缩包内包含的具体文件及其用途的详细信息: 1. TeeChartVCLFMX-2024.40.exe:这个文件很可能是一个安装程序或可执行文件,用于安装或运行TeeChartVCLFMX图表控件。 2. Keygen.exe:这个文件名表明它可能是一个密钥生成器(Key Generator),用于生成软件的注册码或激活码,使得控件可以脱离试用限制或进行合法授权。 3. Delphi29Binaries-2024.40-windows.pak:这个文件名暗示它包含了特定于Windows平台的Delphi 29(可能指的是Delphi 12的内部版本号)的二进制文件。pak文件是压缩包的一种格式,可能包含了运行TeeChartVCLFMX图表控件所需的库文件、DLLs、组件文件等。 4. TeeChartVCLFMX-2024.40 - D12.pdf:这是一个PDF格式的文件,很可能是用户手册或帮助文档,提供了对TeeChartVCLFMX图表控件版本2024.40在Delphi 12中的使用说明,安装指南,功能介绍或示例代码等。 综合以上信息,可以推断TeeChartVCLFMX-2024.40压缩包是为Delphi 12的开发人员提供了一个专业的图表解决方案,使得用户能够将图表功能集成到他们用Delphi开发的应用程序中。TeeChartVCLFMX可能包含各种图表类型(如条形图、折线图、饼图等),以及丰富的定制选项,如颜色、样式、图例、数据绑定、交互式功能等。开发者可以利用TeeChartVCLFMX提供的图表控件在应用程序中创建强大的数据可视化功能,这对数据分析、科学计算、商业智能、财务报告等领域特别有用。 开发者需要使用Delphi 12 IDE配合提供的组件安装程序或执行文件安装和配置TeeChartVCLFMX控件,通过阅读PDF文档来了解如何使用控件,并在需要时使用Keygen.exe激活控件。Delphi29Binaries-2024.40-windows.pak文件可能包含了控件运行所需的核心二进制组件。通过合理使用这些资源,开发者可以将TeeChartVCLFMX控件集成到自己的项目中,快速构建功能丰富的图表和数据可视化组件。
recommend-type

【Keil-ARM性能优化全解】:代码监控与优化工具的实用技巧

# 摘要 本文对基于Keil-ARM平台的性能优化进行了系统性探讨,涵盖了性能监控工具的介绍、代码优化策略、系统资源管理以及综合案例分析。首先,介绍了Keil-ARM的性能监控工具及其在性能分析中的重要性,包括工具的配置和性能数据解读方法。其次,文中讨论了代码层面的优化,包括高效循环和条件语句的编写,函数内联与尾调用优化,以及编译器优化选项的应用。然后,深入分析了ARM系统资源分配、