android通过USB的MTP模式下,禁止用户在根目录有任何操作(重命名 删除 显示特定文件夹)(用户可以定制)

均在在frameworks/base/media/java/android/mtp/中找到MtpDatabase.java文件中完成

Settings.System.putString(getApplicationContext().getContentResolver(), "filename","'DCIM','Android','Music','Movies'");//在计算机要显示的文件夹
Settings.System.putString(getApplicationContext().getContentResolver(),"renamefile","/storage/emulated/0/Movies,/storage/emulated/0/DCIM");//不可以重命名文件
Settings.System.putString(getApplicationContext().getContentResolver(),"deletenamefile","/storage/emulated/0/Android,/storage/emulated/0/Music");//禁止删除的文件

在PC上只显示指定文件夹  createObjectQuery()中

  1. private Cursor createObjectQuery(int storageID, int format, int parent) throws RemoteException {
  2.         String where;
  3.         String[] whereArgs;
  4.         /// M: Added for USB Develpment debug, more log for more debuging help @{
  5.         SXlog.i(TAG, "createObjectQuery: storageID = 0x "+Integer.toHexString(storageID));
  6.         SXlog.i(TAG, "createObjectQuery: format = 0x "+Integer.toHexString(format));
  7.         SXlog.i(TAG, "createObjectQuery: parent = 0x "+Integer.toHexString(parent));
  8.         /// M: @}
  9.         if (storageID == 0xFFFFFFFF) {
  10.             // query all stores
  11.             if (format == 0) {
  12.                 // query all formats
  13.                 if (parent == 0) {
  14.                     // query all objects
  15.                     where = null;
  16.                     whereArgs = null;
  17.                 } else {
  18.                     if (parent == 0xFFFFFFFF) {
  19.                         // all objects in root of store
  20.                         parent = 0;
  21.                     }
  22.                     where = PARENT_WHERE;
  23.                     whereArgs = new String[] { Integer.toString(parent) };
  24.                 }
  25.             } else {
  26.                 // query specific format
  27.                 if (parent == 0) {
  28.                     // query all objects
  29.                     where = FORMAT_WHERE;
  30.                     whereArgs = new String[] { Integer.toString(format) };
  31.                 } else {
  32.                     if (parent == 0xFFFFFFFF) {
  33.                         // all objects in root of store
  34.                         parent = 0;
  35.                     }
  36.                     where = FORMAT_PARENT_WHERE;
  37.                     whereArgs = new String[] { Integer.toString(format),
  38.                                                Integer.toString(parent) };
  39.                 }
  40.             }
  41.         } else {
  42.             // query specific store
  43.             if (format == 0) {
  44.                 // query all formats
  45.                 if (parent == 0) {
  46.                     // query all objects
  47.                     where = STORAGE_WHERE;
  48.                     whereArgs = new String[] { Integer.toString(storageID) };
  49.                 } else {
  50.                     
  51.                     /*wanchengguo add 20180711 在PC上只显示指定文件夹begin*/
  52.                     /*if (parent == 0xFFFFFFFF) {
  53.                         // all objects in root of store
  54.                         parent = 0;
  55.                     }
  56.                     where = FORMAT_PARENT_WHERE;
  57. */
  58.  
  59.                     if (parent == 0xFFFFFFFF) {
  60.                         // all objects in root of store
  61.                         parent = 0;
  62.                         String filename;//,"file_name in ('DCIM','Log','Movies')"
  63.                         filename = Settings.System.getString(mContext.getContentResolver(), "filename");
  64.                         Log.e("wanchengguo", "580filename="+filename);  
  65.                         Log.e("wanchengguo", "270filename="+filename);
  66.             SXlog.i("wanchengguo", "filename = "+filename);
  67.                         if(filename==""){
  68.                            filename =  "'DCIM','Picture','Movies'";
  69.                         }
  70.                         SXlog.i("wanchengguo", "lengthDeviceName = "+filename.length());
  71.                         if(filename.length()>0) {
  72.                            where = STORAGE_PARENT_WHERE+ " AND " +"file_name in ("+filename+")";
  73.                         }else{
  74.                 where = STORAGE_PARENT_WHERE;
  75.             }
  76.             
  77.                         
  78.                     } else{
  79.                         // code by WenYF
  80.                         where = STORAGE_PARENT_WHERE;
  81.                           }
     
  82.                     /*wanchengguo add 20180711 在PC上只显示指定文件夹end*/
  83.                     whereArgs = new String[] { Integer.toString(storageID),
  84.                                                Integer.toString(parent) };
  85.                 }
  86.             } else {
  87.                 // query specific format
  88.                 if (parent == 0) {
  89.                     // query all objects
  90.                     where = STORAGE_FORMAT_WHERE;
  91.                     whereArgs = new String[] {  Integer.toString(storageID),
  92.                                                 Integer.toString(format) };
  93.                 } else {
  94.                     if (parent == 0xFFFFFFFF) {
  95.                         // all objects in root of store
  96.                         parent = 0;
  97.                     }
  98.                     where = STORAGE_FORMAT_PARENT_WHERE;
  99.                     whereArgs = new String[] { Integer.toString(storageID),
  100.                                                Integer.toString(format),
  101.                                                Integer.toString(parent) };
  102.                 }
  103.             }
  104.         }
  105.         // if we are restricting queries to mSubDirectories, we need to add the restriction
  106.         // onto our "where" arguments
  107.         if (mSubDirectoriesWhere != null) {
  108.             /// M: Added for USB Develpment debug, more log for more debuging help
  109.             SXlog.i(TAG, "createObjectQuery: mSubDirectoriesWhere = "+mSubDirectoriesWhere);
  110.             if (where == null) {
  111.                 where = mSubDirectoriesWhere;
  112.                 whereArgs = mSubDirectoriesWhereArgs;
  113.             } else {
  114.                 where = where + " AND " + mSubDirectoriesWhere;
  115.                 // create new array to hold whereArgs and mSubDirectoriesWhereArgs
  116.                 String[] newWhereArgs =
  117.                         new String[whereArgs.length + mSubDirectoriesWhereArgs.length];
  118.                 int i, j;
  119.                 for (i = 0; i < whereArgs.length; i++) {
  120.                     newWhereArgs[i] = whereArgs[i];
  121.                 }
  122.                 for (j = 0; j < mSubDirectoriesWhereArgs.length; i++, j++) {
  123.                     newWhereArgs[i] = mSubDirectoriesWhereArgs[j];
  124.                 }
  125.                 whereArgs = newWhereArgs;
  126.             }
  127.         } else {
  128.             /// M: Added for USB Develpment debug, more log for more debuging help
  129.             SXlog.e(TAG, "createObjectQuery: mSubDirectoriesWhere = null");
  130.         }
  131.         return mMediaProvider.query(mPackageName, mObjectsUri, ID_PROJECTION, where,
  132.                 whereArgs, null, null);
  133.     }

重命名文件 在renameFile()中

  1.   private static final String[] PATH_PROJECTION = new String[] {
  2.             Files.FileColumns._ID, // 0
  3.             Files.FileColumns.DATA, // 1
  4.             Files.FileColumns.PARENT,//2  ADD Files.FileColumns.PARENT 目的是禁止修改头层文件名 wanchengguo 20180716    
  5.     };

 

  1.  private int renameFile(int handle, String newName) {
  2.         Cursor c = null;
  3.         // first compute current path
  4.         String path = null;
  5.         int parent = -1;//禁止修改头层文件名 wanchengguo 20180716
  6.         String[] whereArgs = new String[] {  Integer.toString(handle) };
  7.         try {
  8.             c = mMediaProvider.query(mPackageName, mObjectsUri, PATH_PROJECTION, ID_WHERE,
  9.                     whereArgs, null, null);
  10.            if (c != null && c.moveToNext()) {
  11.                 path = c.getString(1);
  12.                 parent = c.getInt(2);//禁止修改头层文件名 wanchengguo 20180716
  13.             }
  14.         } catch (RemoteException e) {
  15.             Log.e(TAG, "RemoteException in getObjectFilePath", e);
  16.             return MtpConstants.RESPONSE_GENERAL_ERROR;
  17.         } finally {
  18.             if (c != null) {
  19.                 c.close();
  20.             }
  21.         }
  22.         if (path == null) {
  23.             return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE;
  24.         }
  25.         // do not allow renaming any of the special subdirectories
  26.         SXlog.e("wanchengguo", "path "+path);
  27.     //path = /storage/emulated/0/Movies
  28.         
  29.         if (isStorageSubDirectory(path)) {               
  30.         //&&path=="/storage/emulated/0/Movies" 
  31.          return MtpConstants.RESPONSE_OBJECT_WRITE_PROTECTED;
  32.         }
  33.        String renamefile = Settings.System.getString(mContext.getContentResolver(), "renamefile");
  34.       int lengthReName = renamefile.length();
  35.         SXlog.i("wanchengguo", "lengthReName = "+lengthReName);
  36.         
  37.         if(parent != -1&&renamefile.length()>0&&renamefile.contains(path)){//parent == 0是头层文件 !=-1是所有文件 禁止修改文件名 wanchengguo 20180716
  38.             return MtpConstants.RESPONSE_OBJECT_WRITE_PROTECTED;
  39.         }
  40.         // now rename the file.  make sure this succeeds before updating database
  41.         File oldFile = new File(path);
  42.         int lastSlash = path.lastIndexOf('/');
  43.         if (lastSlash <= 1) {
  44.             return MtpConstants.RESPONSE_GENERAL_ERROR;
  45.         }
  46.         String newPath = path.substring(0, lastSlash + 1) + newName;
  47.         File newFile = new File(newPath);
  48.         boolean success = oldFile.renameTo(newFile);

禁止删除文件 deleteFile(int handle)

  1.     private static final String[] PATH_FORMAT_PROJECTION = new String[] {
  2.             Files.FileColumns._ID, // 0
  3.             Files.FileColumns.DATA, // 1
  4.             Files.FileColumns.FORMAT, // 2
  5.             Files.FileColumns.FORMAT, // 3 add  Files.FileColumns.FORMAT  禁止删除头层文件夹 wanchengguo 20180716
  1.  private int deleteFile(int handle) {
  2.         mDatabaseModified = true;
  3.         String path = null;
  4.         int format = 0;
  5.         int parent = -1;//禁止删除头层文件夹 wanchengguo 20180716
  6.         /// M: Added for USB Develpment debug, more log for more debuging help
  7.         SXlog.d(TAG, "deleteFile: handle = 0x"+ Integer.toHexString(handle));
  8.         /// M: Added for USB Develpment debug, more log for more debuging help
  9.         Cursor c = null;
  10.         try {
  11.             c = mMediaProvider.query(mPackageName, mObjectsUri, PATH_FORMAT_PROJECTION,
  12.                             ID_WHERE, new String[] {  Integer.toString(handle) }, null, null);
  13.             if (c != null && c.moveToNext()) {
  14.                 // don't convert to media path here, since we will be matching
  15.                 // against paths in the database matching /data/media
  16.                 path = c.getString(1);
  17.                 format = c.getInt(2);
  18.         parent = c.getInt(3);//禁止删除头层文件夹 wanchengguo 20180716
  19.             } else {
  20.                 return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE;
  21.             }
  22.             if (path == null || format == 0) {
  23.                 return MtpConstants.RESPONSE_GENERAL_ERROR;
  24.             }
  25.         String deletenamefile = Settings.System.getString(mContext.getContentResolver(), "deletenamefile");
  26.         
  27.         SXlog.e("wanchengguo", "953renamefile.contains(path) "+deletenamefile.contains(path));
  28.         int lengthDeleteName = deletenamefile.length();
  29.         SXlog.i("wanchengguo", "lengthDeleteName = "+lengthDeleteName);
  30.         
  31.             //禁止删除头层文件夹 wanchengguo 20180716 begin 
  32.             if (parent != -1&&deletenamefile.length()>0&&deletenamefile.contains(path)) {
  33.                // return MtpConstants.RESPONSE_ACCESS_DENIED;
  34.                return MtpConstants.RESPONSE_GENERAL_ERROR;
  35.                
  36.             }
  37.             //禁止删除头层文件夹 wanchengguo 20180716 end
     

你可能感兴趣的:(android通过USB的MTP模式下,禁止用户在根目录有任何操作(重命名 删除 显示特定文件夹)(用户可以定制))