当前位置:   article > 正文

android 对文件进行添加、删除、更改文件名 .

android file文件修改文件名字

/*
* 文件资源管理器再进化
* 对文件进行添加、更改文件名、删除
* 程序中以自定义的MyAdapter来设置显示数据传入存储文件名与
* 文件路径的两个List对象,使用setListAdapter()将数据设置给
* ListView。当用户单机item时,时会触犯onListItemClick(),
* 此时程序会判断item是文件夹还是文件,是文件夹的话,就展开下
* 一层目录,是文件的话就运行自定义的fileHandle()。fileHandle()
* 这个方法被调用时,会先弹出含有打开文件、更改文件名、删除文件
* 三个选项的AlertDialog。当单机任何一个item时,AlertDialog的
* onClick()事件就会被触发,会依照所选择的item功能来运行不同的
* 动作。
* 当有文件被更改或被删除时,要再次运行getFileDir(),使ListView
* 里面的文件信息是最新的。
*/
import略;

  1. publicclassEx05_15ActivityextendsListActivity{
  2. privateList<String>item=null;//存放显示的名称
  3. privateList<String>paths=null;//存放文件的路径
  4. privateStringrootPath="/";//起始目录
  5. privateTextViewmPaht;
  6. privateViewmyView;
  7. privateEditTextmyEditText;
  8. /**Calledwhentheactivityisfirstcreated.*/
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. mPaht=(TextView)findViewById(R.id.mPath);
  14. getFileDir(rootPath);
  15. }
  16. //取得文件架构的方法
  17. privatevoidgetFileDir(StringfilePath){
  18. //设置目前所在路径
  19. mPaht.setText(filePath);
  20. item=newArrayList<String>();
  21. paths=newArrayList<String>();
  22. Filef=newFile(filePath);
  23. File[]files=f.listFiles();
  24. if(filePath.equals(rootPath)){
  25. //第一笔设置为回到根目录
  26. item.add("b1");
  27. paths.add(rootPath);
  28. //第二笔设置为回到上层
  29. item.add("b2");
  30. paths.add(f.getParent());
  31. }
  32. //将所有文件添加到ArraryList中
  33. for(inti=0;i<files.length;i++){
  34. Filefile=files[i];
  35. item.add(file.getName());
  36. paths.add(file.getPath());
  37. }
  38. //使用自定义的MyAdapter来将数据传入ListActivist
  39. setListAdapter(newMyAdapter(this,item,paths));
  40. }
  41. //设置ListItem被按下是要做的动作
  42. protectedvoidonListenerItemClick(ListViewl,Viewv,intposition,longid){
  43. Filefile=newFile(paths.get(position));
  44. if(file.canRead()){
  45. if(file.isDirectory()){
  46. //如果是文件夹就在执行getFileDir()
  47. getFileDir(paths.get(position));
  48. }else{
  49. //如果是文件则调用fileHandle()
  50. fileHandle(file);
  51. }
  52. }else{
  53. //否则跳出AlertDialog显示权限不足
  54. newAlertDialog.Builder(this)
  55. .setTitle("提示信息")
  56. .setMessage("此文件不能读取或你没有足够的权限")
  57. .setPositiveButton("OK",
  58. newDialogInterface.OnClickListener(){
  59. @Override
  60. publicvoidonClick(DialogInterfacedialog,
  61. intwhich){
  62. //TODOAuto-generatedmethodstub
  63. }
  64. }).show();
  65. }
  66. }
  67. //fileHandle()处理方法
  68. privatevoidfileHandle(finalFilefile){
  69. //TODOAuto-generatedmethodstub
  70. //按下文件时OnClickListener()
  71. android.content.DialogInterface.OnClickListenerlistener1=newDialogInterface.OnClickListener(){
  72. @Override
  73. publicvoidonClick(DialogInterfacedialog,intwhich){
  74. //TODOAuto-generatedmethodstub
  75. if(which==0){
  76. //选择的item为打开文件
  77. openFile(file);
  78. }elseif(which==1){
  79. //选择的item为更改文件的名字
  80. LayoutInflaterfactory=LayoutInflater
  81. .from(Ex05_15Activity.this);
  82. //初始化myChoiceView,使用rename_alert_dialog为layyout
  83. myView=factory
  84. .inflate(R.layout.rename_alert_dialog,null);
  85. myEditText=(EditText)myView.findViewById(R.id.mEdit);
  86. //将原始的文件名先放入到EditText中
  87. myEditText.setText(file.getName());
  88. //一个更改文件名的Dialog的确定按钮的Listener
  89. android.content.DialogInterface.OnClickListenerlistener2=newDialogInterface.OnClickListener(){
  90. @Override
  91. publicvoidonClick(DialogInterfacedialog,intwhich){
  92. //TODOAuto-generatedmethodstub
  93. //取得修改后的文件路径
  94. Stringmodname=myEditText.getText().toString();
  95. finalStringpFile=file.getParentFile().getPath()
  96. +"/";
  97. finalStringnewPath=pFile+modname;
  98. //判断文件是否存在
  99. if(newFile(newPath).exists()){
  100. //排除修改文件时没修改直接送出的情况
  101. if(!modname.equals(file.getName())){
  102. //跳出警告文件名重复,并确认时候修改
  103. newAlertDialog.Builder(
  104. Ex05_15Activity.this)
  105. .setTitle("警告!")
  106. .setMessage("文件已存在,是否要覆盖?")
  107. .setPositiveButton(
  108. "确定",
  109. newDialogInterface.OnClickListener(){
  110. @Override
  111. publicvoidonClick(
  112. DialogInterfacedialog,
  113. intwhich){
  114. //TODO
  115. //Auto-generated
  116. //methodstub
  117. //单机确定,覆盖原来的文件
  118. file.renameTo(newFile(
  119. newPath));
  120. //重新生成文件列表
  121. getFileDir(pFile);
  122. }
  123. })
  124. .setNegativeButton(
  125. "取消",
  126. newDialogInterface.OnClickListener(){
  127. @Override
  128. publicvoidonClick(
  129. DialogInterfacedialog,
  130. intwhich){
  131. //TODO
  132. //Auto-generated
  133. //methodstub
  134. }
  135. }).show();
  136. }
  137. }else{
  138. //文件名不存在直接做修改动作
  139. file.renameTo(newFile(newPath));
  140. getFileDir(pFile);
  141. }
  142. }
  143. };
  144. //更改文件名时跳出对话框
  145. AlertDialogrenameDialog=newAlertDialog.Builder(
  146. Ex05_15Activity.this).create();
  147. renameDialog.setView(myView);
  148. renameDialog.setButton("确定",listener2);
  149. renameDialog.setButton2("取消",
  150. newDialogInterface.OnClickListener(){
  151. @Override
  152. publicvoidonClick(DialogInterfacedialog,
  153. intwhich){
  154. //TODOAuto-generatedmethodstub
  155. }
  156. });
  157. renameDialog.show();
  158. }else{
  159. //选择的item为删除文件
  160. newAlertDialog.Builder(Ex05_15Activity.this)
  161. .setTitle("注意")
  162. .setMessage("确定删除文件?")
  163. .setPositiveButton("确定",
  164. newDialogInterface.OnClickListener(){
  165. @Override
  166. publicvoidonClick(
  167. DialogInterfacedialog,
  168. intwhich){
  169. //TODOAuto-generatedmethodstub
  170. file.delete();
  171. getFileDir(file.getParent());
  172. }
  173. })
  174. .setNegativeButton("取消",
  175. newDialogInterface.OnClickListener(){
  176. @Override
  177. publicvoidonClick(
  178. DialogInterfacedialog,
  179. intwhich){
  180. //TODOAuto-generatedmethodstub
  181. }
  182. }).show();
  183. }
  184. }
  185. };
  186. //选择一个文件时要跳出如何处理文件的ListDialog
  187. String[]menu={"打开文件","更改文件名","删除文件"};
  188. newAlertDialog.Builder(Ex05_15Activity.this).setTitle("你要做什么?")
  189. .setItems(menu,listener1)
  190. .setPositiveButton("取消",newDialogInterface.OnClickListener(){
  191. @Override
  192. publicvoidonClick(DialogInterfacedialog,intwhich){
  193. //TODOAuto-generatedmethodstub
  194. }
  195. }).show();
  196. }
  197. //在手机上打开文件的方法
  198. privatevoidopenFile(Filef){
  199. Intentintent=newIntent();
  200. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  201. intent.setAction(android.content.Intent.ACTION_VIEW);
  202. //调用getMIMEType()来取得MimeType
  203. Stringtype=getMIMEType(f);
  204. //设置intent的file与MimeType
  205. intent.setDataAndType(Uri.fromFile(f),type);
  206. startActivity(intent);
  207. }
  208. privateStringgetMIMEType(Filef){
  209. //TODOAuto-generatedmethodstub
  210. Stringtype="";
  211. StringfName=f.getName();
  212. Stringend=fName
  213. .substring(fName.lastIndexOf("."+1),fName.length())
  214. .toLowerCase();
  215. if(end.equals("m4a")||end.equals("mp3")||end.equals("mid")
  216. ||end.equals("xmf")||end.equals("wav")||end.equals("ogg")){
  217. type="audio";
  218. }elseif(end.equals("3gp")||end.equals("mp4")||end.equals("rmvb")){
  219. type="video";
  220. }elseif(end.equals("jpg")||end.equals("gif")||end.equals("png")
  221. ||end.equals("jpeg")||end.equals("bmp")){
  222. type="image";
  223. }else{
  224. //无法直接打开,就跳出供用户列表选择
  225. type="*";
  226. }
  227. type+="/*";
  228. returntype;
  229. }
  230. }
  1. public class Ex05_15Activity extends ListActivity {
  2. private List<String> item = null;// 存放显示的名称
  3. private List<String> paths = null;// 存放文件的路径
  4. private String rootPath = "/";// 起始目录
  5. private TextView mPaht;
  6. private View myView;
  7. private EditText myEditText;
  8. /** Called when the activity is first created. */
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. mPaht = (TextView) findViewById(R.id.mPath);
  14. getFileDir(rootPath);
  15. }
  16. // 取得文件架构的方法
  17. private void getFileDir(String filePath) {
  18. // 设置目前所在路径
  19. mPaht.setText(filePath);
  20. item = new ArrayList<String>();
  21. paths = new ArrayList<String>();
  22. File f = new File(filePath);
  23. File[] files = f.listFiles();
  24. if (filePath.equals(rootPath)) {
  25. // 第一笔设置为回到根目录
  26. item.add("b1");
  27. paths.add(rootPath);
  28. // 第二笔设置为回到上层
  29. item.add("b2");
  30. paths.add(f.getParent());
  31. }
  32. // 将所有文件添加到ArraryList中
  33. for (int i = 0; i < files.length; i++) {
  34. File file = files[i];
  35. item.add(file.getName());
  36. paths.add(file.getPath());
  37. }
  38. // 使用自定义的MyAdapter来将数据传入ListActivist
  39. setListAdapter(new MyAdapter(this, item, paths));
  40. }
  41. // 设置ListItem被按下是要做的动作
  42. protected void onListenerItemClick(ListView l, View v, int position, long id) {
  43. File file = new File(paths.get(position));
  44. if (file.canRead()) {
  45. if (file.isDirectory()) {
  46. // 如果是文件夹就在执行getFileDir()
  47. getFileDir(paths.get(position));
  48. } else {
  49. // 如果是文件则调用fileHandle()
  50. fileHandle(file);
  51. }
  52. } else {
  53. // 否则跳出AlertDialog显示权限不足
  54. new AlertDialog.Builder(this)
  55. .setTitle("提示信息")
  56. .setMessage("此文件不能读取或你没有足够的权限")
  57. .setPositiveButton("OK",
  58. new DialogInterface.OnClickListener() {
  59. @Override
  60. public void onClick(DialogInterface dialog,
  61. int which) {
  62. // TODO Auto-generated method stub
  63. }
  64. }).show();
  65. }
  66. }
  67. // fileHandle()处理方法
  68. private void fileHandle(final File file) {
  69. // TODO Auto-generated method stub
  70. // 按下文件时OnClickListener()
  71. android.content.DialogInterface.OnClickListener listener1 = new DialogInterface.OnClickListener() {
  72. @Override
  73. public void onClick(DialogInterface dialog, int which) {
  74. // TODO Auto-generated method stub
  75. if (which == 0) {
  76. // 选择的item为打开文件
  77. openFile(file);
  78. } else if (which == 1) {
  79. // 选择的item为更改文件的名字
  80. LayoutInflater factory = LayoutInflater
  81. .from(Ex05_15Activity.this);
  82. // 初始化myChoiceView,使用rename_alert_dialog为layyout
  83. myView = factory
  84. .inflate(R.layout.rename_alert_dialog, null);
  85. myEditText = (EditText) myView.findViewById(R.id.mEdit);
  86. // 将原始的文件名先放入到EditText中
  87. myEditText.setText(file.getName());
  88. // 一个更改文件名的Dialog的确定按钮的Listener
  89. android.content.DialogInterface.OnClickListener listener2 = new DialogInterface.OnClickListener() {
  90. @Override
  91. public void onClick(DialogInterface dialog, int which) {
  92. // TODO Auto-generated method stub
  93. // 取得修改后的文件路径
  94. String modname = myEditText.getText().toString();
  95. final String pFile = file.getParentFile().getPath()
  96. + "/";
  97. final String newPath = pFile + modname;
  98. // 判断文件是否存在
  99. if (new File(newPath).exists()) {
  100. // 排除修改文件时没修改直接送出的情况
  101. if (!modname.equals(file.getName())) {
  102. // 跳出警告 文件名重复,并确认时候修改
  103. new AlertDialog.Builder(
  104. Ex05_15Activity.this)
  105. .setTitle("警告!")
  106. .setMessage("文件已存在,是否要覆盖?")
  107. .setPositiveButton(
  108. "确定",
  109. new DialogInterface.OnClickListener() {
  110. @Override
  111. public void onClick(
  112. DialogInterface dialog,
  113. int which) {
  114. // TODO
  115. // Auto-generated
  116. // method stub
  117. // 单机确定,覆盖原来的文件
  118. file.renameTo(new File(
  119. newPath));
  120. // 重新生成文件列表
  121. getFileDir(pFile);
  122. }
  123. })
  124. .setNegativeButton(
  125. "取消",
  126. new DialogInterface.OnClickListener() {
  127. @Override
  128. public void onClick(
  129. DialogInterface dialog,
  130. int which) {
  131. // TODO
  132. // Auto-generated
  133. // method stub
  134. }
  135. }).show();
  136. }
  137. } else {
  138. // 文件名不存在直接做修改动作
  139. file.renameTo(new File(newPath));
  140. getFileDir(pFile);
  141. }
  142. }
  143. };
  144. // 更改文件名时跳出对话框
  145. AlertDialog renameDialog = new AlertDialog.Builder(
  146. Ex05_15Activity.this).create();
  147. renameDialog.setView(myView);
  148. renameDialog.setButton("确定", listener2);
  149. renameDialog.setButton2("取消",
  150. new DialogInterface.OnClickListener() {
  151. @Override
  152. public void onClick(DialogInterface dialog,
  153. int which) {
  154. // TODO Auto-generated method stub
  155. }
  156. });
  157. renameDialog.show();
  158. } else {
  159. // 选择的item为删除文件
  160. new AlertDialog.Builder(Ex05_15Activity.this)
  161. .setTitle("注意")
  162. .setMessage("确定删除文件?")
  163. .setPositiveButton("确定",
  164. new DialogInterface.OnClickListener() {
  165. @Override
  166. public void onClick(
  167. DialogInterface dialog,
  168. int which) {
  169. // TODO Auto-generated method stub
  170. file.delete();
  171. getFileDir(file.getParent());
  172. }
  173. })
  174. .setNegativeButton("取消",
  175. new DialogInterface.OnClickListener() {
  176. @Override
  177. public void onClick(
  178. DialogInterface dialog,
  179. int which) {
  180. // TODO Auto-generated method stub
  181. }
  182. }).show();
  183. }
  184. }
  185. };
  186. // 选择一个文件时要跳出如何处理文件的ListDialog
  187. String[] menu = { "打开文件", "更改文件名", "删除文件" };
  188. new AlertDialog.Builder(Ex05_15Activity.this).setTitle("你要做什么?")
  189. .setItems(menu, listener1)
  190. .setPositiveButton("取消", new DialogInterface.OnClickListener() {
  191. @Override
  192. public void onClick(DialogInterface dialog, int which) {
  193. // TODO Auto-generated method stub
  194. }
  195. }).show();
  196. }
  197. // 在手机上打开文件的方法
  198. private void openFile(File f) {
  199. Intent intent = new Intent();
  200. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  201. intent.setAction(android.content.Intent.ACTION_VIEW);
  202. // 调用getMIMEType()来取得MimeType
  203. String type = getMIMEType(f);
  204. // 设置intent的file与MimeType
  205. intent.setDataAndType(Uri.fromFile(f), type);
  206. startActivity(intent);
  207. }
  208. private String getMIMEType(File f) {
  209. // TODO Auto-generated method stub
  210. String type = "";
  211. String fName = f.getName();
  212. String end = fName
  213. .substring(fName.lastIndexOf("." + 1), fName.length())
  214. .toLowerCase();
  215. if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")
  216. || end.equals("xmf") || end.equals("wav") || end.equals("ogg")) {
  217. type = "audio";
  218. } else if (end.equals("3gp") || end.equals("mp4") || end.equals("rmvb")) {
  219. type = "video";
  220. } else if (end.equals("jpg") || end.equals("gif") || end.equals("png")
  221. || end.equals("jpeg") || end.equals("bmp")) {
  222. type = "image";
  223. } else {
  224. // 无法直接打开,就跳出供用户列表选择
  225. type = "*";
  226. }
  227. type += "/*";
  228. return type;
  229. }
  230. }


MyAdapter.java代码如下:

  1. /*自定义的Adapter,继承android.widget.BaseAdapter*/
  2. publicclassMyAdapterextendsBaseAdapter{
  3. /*
  4. *变量声明mIcon1:并到根目录的图文件mIcon2:并到第几层的图片mIcon3:文件夹的图文件mIcon4:文件的图片
  5. */
  6. privateLayoutInflatermInflater;
  7. privateBitmapmIcon1;
  8. privateBitmapmIcon2;
  9. privateBitmapmIcon3;
  10. privateBitmapmIcon4;
  11. privateList<String>items;
  12. privateList<String>paths;
  13. /*MyAdapter的构造符,传入三个参数*/
  14. publicMyAdapter(Contextcontext,List<String>it,List<String>pa){
  15. /*参数初始化*/
  16. mInflater=LayoutInflater.from(context);
  17. items=it;
  18. paths=pa;
  19. mIcon1=BitmapFactory.decodeResource(context.getResources(),
  20. R.drawable.back01);
  21. mIcon2=BitmapFactory.decodeResource(context.getResources(),
  22. R.drawable.back02);
  23. mIcon3=BitmapFactory.decodeResource(context.getResources(),
  24. R.drawable.folder);
  25. mIcon4=BitmapFactory.decodeResource(context.getResources(),
  26. R.drawable.doc);
  27. }
  28. /*继承BaseAdapter,需重写method*/
  29. @Override
  30. publicintgetCount(){
  31. returnitems.size();
  32. }
  33. @Override
  34. publicObjectgetItem(intposition){
  35. returnitems.get(position);
  36. }
  37. @Override
  38. publiclonggetItemId(intposition){
  39. returnposition;
  40. }
  41. @Override
  42. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  43. ViewHolderholder;
  44. if(convertView==null){
  45. /*使用告定义的file_row作为Layout*/
  46. convertView=mInflater.inflate(R.layout.file_row,null);
  47. /*初始化holder的text与icon*/
  48. holder=newViewHolder();
  49. holder.text=(TextView)convertView.findViewById(R.id.text);
  50. holder.icon=(ImageView)convertView.findViewById(R.id.icon);
  51. convertView.setTag(holder);
  52. }else{
  53. holder=(ViewHolder)convertView.getTag();
  54. }
  55. Filef=newFile(paths.get(position).toString());
  56. /*设定[并到根目录]的文字与icon*/
  57. if(items.get(position).toString().equals("b1")){
  58. holder.text.setText("Backto/");
  59. holder.icon.setImageBitmap(mIcon1);
  60. }
  61. /*设定[并到第几层]的文字与icon*/
  62. elseif(items.get(position).toString().equals("b2")){
  63. holder.text.setText("Backto..");
  64. holder.icon.setImageBitmap(mIcon2);
  65. }
  66. /*设定[文件或文件夹]的文字与icon*/
  67. else{
  68. holder.text.setText(f.getName());
  69. if(f.isDirectory()){
  70. holder.icon.setImageBitmap(mIcon3);
  71. }else{
  72. holder.icon.setImageBitmap(mIcon4);
  73. }
  74. }
  75. returnconvertView;
  76. }
  77. /*classViewHolder*/
  78. privateclassViewHolder{
  79. TextViewtext;
  80. ImageViewicon;
  81. }
  82. }
  1. /* 自定义的Adapter,继承android.widget.BaseAdapter */
  2. public class MyAdapter extends BaseAdapter {
  3. /*
  4. * 变量声明 mIcon1:并到根目录的图文件 mIcon2:并到第几层的图片 mIcon3:文件夹的图文件 mIcon4:文件的图片
  5. */
  6. private LayoutInflater mInflater;
  7. private Bitmap mIcon1;
  8. private Bitmap mIcon2;
  9. private Bitmap mIcon3;
  10. private Bitmap mIcon4;
  11. private List<String> items;
  12. private List<String> paths;
  13. /* MyAdapter的构造符,传入三个参数 */
  14. public MyAdapter(Context context, List<String> it, List<String> pa) {
  15. /* 参数初始化 */
  16. mInflater = LayoutInflater.from(context);
  17. items = it;
  18. paths = pa;
  19. mIcon1 = BitmapFactory.decodeResource(context.getResources(),
  20. R.drawable.back01);
  21. mIcon2 = BitmapFactory.decodeResource(context.getResources(),
  22. R.drawable.back02);
  23. mIcon3 = BitmapFactory.decodeResource(context.getResources(),
  24. R.drawable.folder);
  25. mIcon4 = BitmapFactory.decodeResource(context.getResources(),
  26. R.drawable.doc);
  27. }
  28. /* 继承BaseAdapter,需重写method */
  29. @Override
  30. public int getCount() {
  31. return items.size();
  32. }
  33. @Override
  34. public Object getItem(int position) {
  35. return items.get(position);
  36. }
  37. @Override
  38. public long getItemId(int position) {
  39. return position;
  40. }
  41. @Override
  42. public View getView(int position, View convertView, ViewGroup parent) {
  43. ViewHolder holder;
  44. if (convertView == null) {
  45. /* 使用告定义的file_row作为Layout */
  46. convertView = mInflater.inflate(R.layout.file_row, null);
  47. /* 初始化holder的text与icon */
  48. holder = new ViewHolder();
  49. holder.text = (TextView) convertView.findViewById(R.id.text);
  50. holder.icon = (ImageView) convertView.findViewById(R.id.icon);
  51. convertView.setTag(holder);
  52. } else {
  53. holder = (ViewHolder) convertView.getTag();
  54. }
  55. File f = new File(paths.get(position).toString());
  56. /* 设定[并到根目录]的文字与icon */
  57. if (items.get(position).toString().equals("b1")) {
  58. holder.text.setText("Back to /");
  59. holder.icon.setImageBitmap(mIcon1);
  60. }
  61. /* 设定[并到第几层]的文字与icon */
  62. else if (items.get(position).toString().equals("b2")) {
  63. holder.text.setText("Back to ..");
  64. holder.icon.setImageBitmap(mIcon2);
  65. }
  66. /* 设定[文件或文件夹]的文字与icon */
  67. else {
  68. holder.text.setText(f.getName());
  69. if (f.isDirectory()) {
  70. holder.icon.setImageBitmap(mIcon3);
  71. } else {
  72. holder.icon.setImageBitmap(mIcon4);
  73. }
  74. }
  75. return convertView;
  76. }
  77. /* class ViewHolder */
  78. private class ViewHolder {
  79. TextView text;
  80. ImageView icon;
  81. }
  82. }

布局文件很简单,在这里我就不做详细介绍了。下面我我们来看看运行后的结果:

当你权限不足时会:

/*
* 文件资源管理器再进化
* 对文件进行添加、更改文件名、删除
* 程序中以自定义的MyAdapter来设置显示数据传入存储文件名与
* 文件路径的两个List对象,使用setListAdapter()将数据设置给
* ListView。当用户单机item时,时会触犯onListItemClick(),
* 此时程序会判断item是文件夹还是文件,是文件夹的话,就展开下
* 一层目录,是文件的话就运行自定义的fileHandle()。fileHandle()
* 这个方法被调用时,会先弹出含有打开文件、更改文件名、删除文件
* 三个选项的AlertDialog。当单机任何一个item时,AlertDialog的
* onClick()事件就会被触发,会依照所选择的item功能来运行不同的
* 动作。
* 当有文件被更改或被删除时,要再次运行getFileDir(),使ListView
* 里面的文件信息是最新的。
*/
import略;

  1. publicclassEx05_15ActivityextendsListActivity{
  2. privateList<String>item=null;//存放显示的名称
  3. privateList<String>paths=null;//存放文件的路径
  4. privateStringrootPath="/";//起始目录
  5. privateTextViewmPaht;
  6. privateViewmyView;
  7. privateEditTextmyEditText;
  8. /**Calledwhentheactivityisfirstcreated.*/
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. mPaht=(TextView)findViewById(R.id.mPath);
  14. getFileDir(rootPath);
  15. }
  16. //取得文件架构的方法
  17. privatevoidgetFileDir(StringfilePath){
  18. //设置目前所在路径
  19. mPaht.setText(filePath);
  20. item=newArrayList<String>();
  21. paths=newArrayList<String>();
  22. Filef=newFile(filePath);
  23. File[]files=f.listFiles();
  24. if(filePath.equals(rootPath)){
  25. //第一笔设置为回到根目录
  26. item.add("b1");
  27. paths.add(rootPath);
  28. //第二笔设置为回到上层
  29. item.add("b2");
  30. paths.add(f.getParent());
  31. }
  32. //将所有文件添加到ArraryList中
  33. for(inti=0;i<files.length;i++){
  34. Filefile=files[i];
  35. item.add(file.getName());
  36. paths.add(file.getPath());
  37. }
  38. //使用自定义的MyAdapter来将数据传入ListActivist
  39. setListAdapter(newMyAdapter(this,item,paths));
  40. }
  41. //设置ListItem被按下是要做的动作
  42. protectedvoidonListenerItemClick(ListViewl,Viewv,intposition,longid){
  43. Filefile=newFile(paths.get(position));
  44. if(file.canRead()){
  45. if(file.isDirectory()){
  46. //如果是文件夹就在执行getFileDir()
  47. getFileDir(paths.get(position));
  48. }else{
  49. //如果是文件则调用fileHandle()
  50. fileHandle(file);
  51. }
  52. }else{
  53. //否则跳出AlertDialog显示权限不足
  54. newAlertDialog.Builder(this)
  55. .setTitle("提示信息")
  56. .setMessage("此文件不能读取或你没有足够的权限")
  57. .setPositiveButton("OK",
  58. newDialogInterface.OnClickListener(){
  59. @Override
  60. publicvoidonClick(DialogInterfacedialog,
  61. intwhich){
  62. //TODOAuto-generatedmethodstub
  63. }
  64. }).show();
  65. }
  66. }
  67. //fileHandle()处理方法
  68. privatevoidfileHandle(finalFilefile){
  69. //TODOAuto-generatedmethodstub
  70. //按下文件时OnClickListener()
  71. android.content.DialogInterface.OnClickListenerlistener1=newDialogInterface.OnClickListener(){
  72. @Override
  73. publicvoidonClick(DialogInterfacedialog,intwhich){
  74. //TODOAuto-generatedmethodstub
  75. if(which==0){
  76. //选择的item为打开文件
  77. openFile(file);
  78. }elseif(which==1){
  79. //选择的item为更改文件的名字
  80. LayoutInflaterfactory=LayoutInflater
  81. .from(Ex05_15Activity.this);
  82. //初始化myChoiceView,使用rename_alert_dialog为layyout
  83. myView=factory
  84. .inflate(R.layout.rename_alert_dialog,null);
  85. myEditText=(EditText)myView.findViewById(R.id.mEdit);
  86. //将原始的文件名先放入到EditText中
  87. myEditText.setText(file.getName());
  88. //一个更改文件名的Dialog的确定按钮的Listener
  89. android.content.DialogInterface.OnClickListenerlistener2=newDialogInterface.OnClickListener(){
  90. @Override
  91. publicvoidonClick(DialogInterfacedialog,intwhich){
  92. //TODOAuto-generatedmethodstub
  93. //取得修改后的文件路径
  94. Stringmodname=myEditText.getText().toString();
  95. finalStringpFile=file.getParentFile().getPath()
  96. +"/";
  97. finalStringnewPath=pFile+modname;
  98. //判断文件是否存在
  99. if(newFile(newPath).exists()){
  100. //排除修改文件时没修改直接送出的情况
  101. if(!modname.equals(file.getName())){
  102. //跳出警告文件名重复,并确认时候修改
  103. newAlertDialog.Builder(
  104. Ex05_15Activity.this)
  105. .setTitle("警告!")
  106. .setMessage("文件已存在,是否要覆盖?")
  107. .setPositiveButton(
  108. "确定",
  109. newDialogInterface.OnClickListener(){
  110. @Override
  111. publicvoidonClick(
  112. DialogInterfacedialog,
  113. intwhich){
  114. //TODO
  115. //Auto-generated
  116. //methodstub
  117. //单机确定,覆盖原来的文件
  118. file.renameTo(newFile(
  119. newPath));
  120. //重新生成文件列表
  121. getFileDir(pFile);
  122. }
  123. })
  124. .setNegativeButton(
  125. "取消",
  126. newDialogInterface.OnClickListener(){
  127. @Override
  128. publicvoidonClick(
  129. DialogInterfacedialog,
  130. intwhich){
  131. //TODO
  132. //Auto-generated
  133. //methodstub
  134. }
  135. }).show();
  136. }
  137. }else{
  138. //文件名不存在直接做修改动作
  139. file.renameTo(newFile(newPath));
  140. getFileDir(pFile);
  141. }
  142. }
  143. };
  144. //更改文件名时跳出对话框
  145. AlertDialogrenameDialog=newAlertDialog.Builder(
  146. Ex05_15Activity.this).create();
  147. renameDialog.setView(myView);
  148. renameDialog.setButton("确定",listener2);
  149. renameDialog.setButton2("取消",
  150. newDialogInterface.OnClickListener(){
  151. @Override
  152. publicvoidonClick(DialogInterfacedialog,
  153. intwhich){
  154. //TODOAuto-generatedmethodstub
  155. }
  156. });
  157. renameDialog.show();
  158. }else{
  159. //选择的item为删除文件
  160. newAlertDialog.Builder(Ex05_15Activity.this)
  161. .setTitle("注意")
  162. .setMessage("确定删除文件?")
  163. .setPositiveButton("确定",
  164. newDialogInterface.OnClickListener(){
  165. @Override
  166. publicvoidonClick(
  167. DialogInterfacedialog,
  168. intwhich){
  169. //TODOAuto-generatedmethodstub
  170. file.delete();
  171. getFileDir(file.getParent());
  172. }
  173. })
  174. .setNegativeButton("取消",
  175. newDialogInterface.OnClickListener(){
  176. @Override
  177. publicvoidonClick(
  178. DialogInterfacedialog,
  179. intwhich){
  180. //TODOAuto-generatedmethodstub
  181. }
  182. }).show();
  183. }
  184. }
  185. };
  186. //选择一个文件时要跳出如何处理文件的ListDialog
  187. String[]menu={"打开文件","更改文件名","删除文件"};
  188. newAlertDialog.Builder(Ex05_15Activity.this).setTitle("你要做什么?")
  189. .setItems(menu,listener1)
  190. .setPositiveButton("取消",newDialogInterface.OnClickListener(){
  191. @Override
  192. publicvoidonClick(DialogInterfacedialog,intwhich){
  193. //TODOAuto-generatedmethodstub
  194. }
  195. }).show();
  196. }
  197. //在手机上打开文件的方法
  198. privatevoidopenFile(Filef){
  199. Intentintent=newIntent();
  200. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  201. intent.setAction(android.content.Intent.ACTION_VIEW);
  202. //调用getMIMEType()来取得MimeType
  203. Stringtype=getMIMEType(f);
  204. //设置intent的file与MimeType
  205. intent.setDataAndType(Uri.fromFile(f),type);
  206. startActivity(intent);
  207. }
  208. privateStringgetMIMEType(Filef){
  209. //TODOAuto-generatedmethodstub
  210. Stringtype="";
  211. StringfName=f.getName();
  212. Stringend=fName
  213. .substring(fName.lastIndexOf("."+1),fName.length())
  214. .toLowerCase();
  215. if(end.equals("m4a")||end.equals("mp3")||end.equals("mid")
  216. ||end.equals("xmf")||end.equals("wav")||end.equals("ogg")){
  217. type="audio";
  218. }elseif(end.equals("3gp")||end.equals("mp4")||end.equals("rmvb")){
  219. type="video";
  220. }elseif(end.equals("jpg")||end.equals("gif")||end.equals("png")
  221. ||end.equals("jpeg")||end.equals("bmp")){
  222. type="image";
  223. }else{
  224. //无法直接打开,就跳出供用户列表选择
  225. type="*";
  226. }
  227. type+="/*";
  228. returntype;
  229. }
  230. }
  1. public class Ex05_15Activity extends ListActivity {
  2. private List<String> item = null;// 存放显示的名称
  3. private List<String> paths = null;// 存放文件的路径
  4. private String rootPath = "/";// 起始目录
  5. private TextView mPaht;
  6. private View myView;
  7. private EditText myEditText;
  8. /** Called when the activity is first created. */
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. mPaht = (TextView) findViewById(R.id.mPath);
  14. getFileDir(rootPath);
  15. }
  16. // 取得文件架构的方法
  17. private void getFileDir(String filePath) {
  18. // 设置目前所在路径
  19. mPaht.setText(filePath);
  20. item = new ArrayList<String>();
  21. paths = new ArrayList<String>();
  22. File f = new File(filePath);
  23. File[] files = f.listFiles();
  24. if (filePath.equals(rootPath)) {
  25. // 第一笔设置为回到根目录
  26. item.add("b1");
  27. paths.add(rootPath);
  28. // 第二笔设置为回到上层
  29. item.add("b2");
  30. paths.add(f.getParent());
  31. }
  32. // 将所有文件添加到ArraryList中
  33. for (int i = 0; i < files.length; i++) {
  34. File file = files[i];
  35. item.add(file.getName());
  36. paths.add(file.getPath());
  37. }
  38. // 使用自定义的MyAdapter来将数据传入ListActivist
  39. setListAdapter(new MyAdapter(this, item, paths));
  40. }
  41. // 设置ListItem被按下是要做的动作
  42. protected void onListenerItemClick(ListView l, View v, int position, long id) {
  43. File file = new File(paths.get(position));
  44. if (file.canRead()) {
  45. if (file.isDirectory()) {
  46. // 如果是文件夹就在执行getFileDir()
  47. getFileDir(paths.get(position));
  48. } else {
  49. // 如果是文件则调用fileHandle()
  50. fileHandle(file);
  51. }
  52. } else {
  53. // 否则跳出AlertDialog显示权限不足
  54. new AlertDialog.Builder(this)
  55. .setTitle("提示信息")
  56. .setMessage("此文件不能读取或你没有足够的权限")
  57. .setPositiveButton("OK",
  58. new DialogInterface.OnClickListener() {
  59. @Override
  60. public void onClick(DialogInterface dialog,
  61. int which) {
  62. // TODO Auto-generated method stub
  63. }
  64. }).show();
  65. }
  66. }
  67. // fileHandle()处理方法
  68. private void fileHandle(final File file) {
  69. // TODO Auto-generated method stub
  70. // 按下文件时OnClickListener()
  71. android.content.DialogInterface.OnClickListener listener1 = new DialogInterface.OnClickListener() {
  72. @Override
  73. public void onClick(DialogInterface dialog, int which) {
  74. // TODO Auto-generated method stub
  75. if (which == 0) {
  76. // 选择的item为打开文件
  77. openFile(file);
  78. } else if (which == 1) {
  79. // 选择的item为更改文件的名字
  80. LayoutInflater factory = LayoutInflater
  81. .from(Ex05_15Activity.this);
  82. // 初始化myChoiceView,使用rename_alert_dialog为layyout
  83. myView = factory
  84. .inflate(R.layout.rename_alert_dialog, null);
  85. myEditText = (EditText) myView.findViewById(R.id.mEdit);
  86. // 将原始的文件名先放入到EditText中
  87. myEditText.setText(file.getName());
  88. // 一个更改文件名的Dialog的确定按钮的Listener
  89. android.content.DialogInterface.OnClickListener listener2 = new DialogInterface.OnClickListener() {
  90. @Override
  91. public void onClick(DialogInterface dialog, int which) {
  92. // TODO Auto-generated method stub
  93. // 取得修改后的文件路径
  94. String modname = myEditText.getText().toString();
  95. final String pFile = file.getParentFile().getPath()
  96. + "/";
  97. final String newPath = pFile + modname;
  98. // 判断文件是否存在
  99. if (new File(newPath).exists()) {
  100. // 排除修改文件时没修改直接送出的情况
  101. if (!modname.equals(file.getName())) {
  102. // 跳出警告 文件名重复,并确认时候修改
  103. new AlertDialog.Builder(
  104. Ex05_15Activity.this)
  105. .setTitle("警告!")
  106. .setMessage("文件已存在,是否要覆盖?")
  107. .setPositiveButton(
  108. "确定",
  109. new DialogInterface.OnClickListener() {
  110. @Override
  111. public void onClick(
  112. DialogInterface dialog,
  113. int which) {
  114. // TODO
  115. // Auto-generated
  116. // method stub
  117. // 单机确定,覆盖原来的文件
  118. file.renameTo(new File(
  119. newPath));
  120. // 重新生成文件列表
  121. getFileDir(pFile);
  122. }
  123. })
  124. .setNegativeButton(
  125. "取消",
  126. new DialogInterface.OnClickListener() {
  127. @Override
  128. public void onClick(
  129. DialogInterface dialog,
  130. int which) {
  131. // TODO
  132. // Auto-generated
  133. // method stub
  134. }
  135. }).show();
  136. }
  137. } else {
  138. // 文件名不存在直接做修改动作
  139. file.renameTo(new File(newPath));
  140. getFileDir(pFile);
  141. }
  142. }
  143. };
  144. // 更改文件名时跳出对话框
  145. AlertDialog renameDialog = new AlertDialog.Builder(
  146. Ex05_15Activity.this).create();
  147. renameDialog.setView(myView);
  148. renameDialog.setButton("确定", listener2);
  149. renameDialog.setButton2("取消",
  150. new DialogInterface.OnClickListener() {
  151. @Override
  152. public void onClick(DialogInterface dialog,
  153. int which) {
  154. // TODO Auto-generated method stub
  155. }
  156. });
  157. renameDialog.show();
  158. } else {
  159. // 选择的item为删除文件
  160. new AlertDialog.Builder(Ex05_15Activity.this)
  161. .setTitle("注意")
  162. .setMessage("确定删除文件?")
  163. .setPositiveButton("确定",
  164. new DialogInterface.OnClickListener() {
  165. @Override
  166. public void onClick(
  167. DialogInterface dialog,
  168. int which) {
  169. // TODO Auto-generated method stub
  170. file.delete();
  171. getFileDir(file.getParent());
  172. }
  173. })
  174. .setNegativeButton("取消",
  175. new DialogInterface.OnClickListener() {
  176. @Override
  177. public void onClick(
  178. DialogInterface dialog,
  179. int which) {
  180. // TODO Auto-generated method stub
  181. }
  182. }).show();
  183. }
  184. }
  185. };
  186. // 选择一个文件时要跳出如何处理文件的ListDialog
  187. String[] menu = { "打开文件", "更改文件名", "删除文件" };
  188. new AlertDialog.Builder(Ex05_15Activity.this).setTitle("你要做什么?")
  189. .setItems(menu, listener1)
  190. .setPositiveButton("取消", new DialogInterface.OnClickListener() {
  191. @Override
  192. public void onClick(DialogInterface dialog, int which) {
  193. // TODO Auto-generated method stub
  194. }
  195. }).show();
  196. }
  197. // 在手机上打开文件的方法
  198. private void openFile(File f) {
  199. Intent intent = new Intent();
  200. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  201. intent.setAction(android.content.Intent.ACTION_VIEW);
  202. // 调用getMIMEType()来取得MimeType
  203. String type = getMIMEType(f);
  204. // 设置intent的file与MimeType
  205. intent.setDataAndType(Uri.fromFile(f), type);
  206. startActivity(intent);
  207. }
  208. private String getMIMEType(File f) {
  209. // TODO Auto-generated method stub
  210. String type = "";
  211. String fName = f.getName();
  212. String end = fName
  213. .substring(fName.lastIndexOf("." + 1), fName.length())
  214. .toLowerCase();
  215. if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")
  216. || end.equals("xmf") || end.equals("wav") || end.equals("ogg")) {
  217. type = "audio";
  218. } else if (end.equals("3gp") || end.equals("mp4") || end.equals("rmvb")) {
  219. type = "video";
  220. } else if (end.equals("jpg") || end.equals("gif") || end.equals("png")
  221. || end.equals("jpeg") || end.equals("bmp")) {
  222. type = "image";
  223. } else {
  224. // 无法直接打开,就跳出供用户列表选择
  225. type = "*";
  226. }
  227. type += "/*";
  228. return type;
  229. }
  230. }


MyAdapter.java代码如下:

  1. /*自定义的Adapter,继承android.widget.BaseAdapter*/
  2. publicclassMyAdapterextendsBaseAdapter{
  3. /*
  4. *变量声明mIcon1:并到根目录的图文件mIcon2:并到第几层的图片mIcon3:文件夹的图文件mIcon4:文件的图片
  5. */
  6. privateLayoutInflatermInflater;
  7. privateBitmapmIcon1;
  8. privateBitmapmIcon2;
  9. privateBitmapmIcon3;
  10. privateBitmapmIcon4;
  11. privateList<String>items;
  12. privateList<String>paths;
  13. /*MyAdapter的构造符,传入三个参数*/
  14. publicMyAdapter(Contextcontext,List<String>it,List<String>pa){
  15. /*参数初始化*/
  16. mInflater=LayoutInflater.from(context);
  17. items=it;
  18. paths=pa;
  19. mIcon1=BitmapFactory.decodeResource(context.getResources(),
  20. R.drawable.back01);
  21. mIcon2=BitmapFactory.decodeResource(context.getResources(),
  22. R.drawable.back02);
  23. mIcon3=BitmapFactory.decodeResource(context.getResources(),
  24. R.drawable.folder);
  25. mIcon4=BitmapFactory.decodeResource(context.getResources(),
  26. R.drawable.doc);
  27. }
  28. /*继承BaseAdapter,需重写method*/
  29. @Override
  30. publicintgetCount(){
  31. returnitems.size();
  32. }
  33. @Override
  34. publicObjectgetItem(intposition){
  35. returnitems.get(position);
  36. }
  37. @Override
  38. publiclonggetItemId(intposition){
  39. returnposition;
  40. }
  41. @Override
  42. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  43. ViewHolderholder;
  44. if(convertView==null){
  45. /*使用告定义的file_row作为Layout*/
  46. convertView=mInflater.inflate(R.layout.file_row,null);
  47. /*初始化holder的text与icon*/
  48. holder=newViewHolder();
  49. holder.text=(TextView)convertView.findViewById(R.id.text);
  50. holder.icon=(ImageView)convertView.findViewById(R.id.icon);
  51. convertView.setTag(holder);
  52. }else{
  53. holder=(ViewHolder)convertView.getTag();
  54. }
  55. Filef=newFile(paths.get(position).toString());
  56. /*设定[并到根目录]的文字与icon*/
  57. if(items.get(position).toString().equals("b1")){
  58. holder.text.setText("Backto/");
  59. holder.icon.setImageBitmap(mIcon1);
  60. }
  61. /*设定[并到第几层]的文字与icon*/
  62. elseif(items.get(position).toString().equals("b2")){
  63. holder.text.setText("Backto..");
  64. holder.icon.setImageBitmap(mIcon2);
  65. }
  66. /*设定[文件或文件夹]的文字与icon*/
  67. else{
  68. holder.text.setText(f.getName());
  69. if(f.isDirectory()){
  70. holder.icon.setImageBitmap(mIcon3);
  71. }else{
  72. holder.icon.setImageBitmap(mIcon4);
  73. }
  74. }
  75. returnconvertView;
  76. }
  77. /*classViewHolder*/
  78. privateclassViewHolder{
  79. TextViewtext;
  80. ImageViewicon;
  81. }
  82. }
  1. /* 自定义的Adapter,继承android.widget.BaseAdapter */
  2. public class MyAdapter extends BaseAdapter {
  3. /*
  4. * 变量声明 mIcon1:并到根目录的图文件 mIcon2:并到第几层的图片 mIcon3:文件夹的图文件 mIcon4:文件的图片
  5. */
  6. private LayoutInflater mInflater;
  7. private Bitmap mIcon1;
  8. private Bitmap mIcon2;
  9. private Bitmap mIcon3;
  10. private Bitmap mIcon4;
  11. private List<String> items;
  12. private List<String> paths;
  13. /* MyAdapter的构造符,传入三个参数 */
  14. public MyAdapter(Context context, List<String> it, List<String> pa) {
  15. /* 参数初始化 */
  16. mInflater = LayoutInflater.from(context);
  17. items = it;
  18. paths = pa;
  19. mIcon1 = BitmapFactory.decodeResource(context.getResources(),
  20. R.drawable.back01);
  21. mIcon2 = BitmapFactory.decodeResource(context.getResources(),
  22. R.drawable.back02);
  23. mIcon3 = BitmapFactory.decodeResource(context.getResources(),
  24. R.drawable.folder);
  25. mIcon4 = BitmapFactory.decodeResource(context.getResources(),
  26. R.drawable.doc);
  27. }
  28. /* 继承BaseAdapter,需重写method */
  29. @Override
  30. public int getCount() {
  31. return items.size();
  32. }
  33. @Override
  34. public Object getItem(int position) {
  35. return items.get(position);
  36. }
  37. @Override
  38. public long getItemId(int position) {
  39. return position;
  40. }
  41. @Override
  42. public View getView(int position, View convertView, ViewGroup parent) {
  43. ViewHolder holder;
  44. if (convertView == null) {
  45. /* 使用告定义的file_row作为Layout */
  46. convertView = mInflater.inflate(R.layout.file_row, null);
  47. /* 初始化holder的text与icon */
  48. holder = new ViewHolder();
  49. holder.text = (TextView) convertView.findViewById(R.id.text);
  50. holder.icon = (ImageView) convertView.findViewById(R.id.icon);
  51. convertView.setTag(holder);
  52. } else {
  53. holder = (ViewHolder) convertView.getTag();
  54. }
  55. File f = new File(paths.get(position).toString());
  56. /* 设定[并到根目录]的文字与icon */
  57. if (items.get(position).toString().equals("b1")) {
  58. holder.text.setText("Back to /");
  59. holder.icon.setImageBitmap(mIcon1);
  60. }
  61. /* 设定[并到第几层]的文字与icon */
  62. else if (items.get(position).toString().equals("b2")) {
  63. holder.text.setText("Back to ..");
  64. holder.icon.setImageBitmap(mIcon2);
  65. }
  66. /* 设定[文件或文件夹]的文字与icon */
  67. else {
  68. holder.text.setText(f.getName());
  69. if (f.isDirectory()) {
  70. holder.icon.setImageBitmap(mIcon3);
  71. } else {
  72. holder.icon.setImageBitmap(mIcon4);
  73. }
  74. }
  75. return convertView;
  76. }
  77. /* class ViewHolder */
  78. private class ViewHolder {
  79. TextView text;
  80. ImageView icon;
  81. }
  82. }

布局文件很简单,在这里我就不做详细介绍了。下面我我们来看看运行后的结果:

当你权限不足时会:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/710471
推荐阅读
相关标签
  

闽ICP备14008679号