android通过USB的MTP模式下,禁止用户在根目录有任何操作(重命名 删除 显示特定文件夹)(用户可以定制)
16lz
2021-01-23
均在在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()中
- private Cursor createObjectQuery(int storageID, int format, int parent) throws RemoteException {
- String where;
- String[] whereArgs;
- /// M: Added for USB Develpment debug, more log for more debuging help @{
- SXlog.i(TAG, "createObjectQuery: storageID = 0x "+Integer.toHexString(storageID));
- SXlog.i(TAG, "createObjectQuery: format = 0x "+Integer.toHexString(format));
- SXlog.i(TAG, "createObjectQuery: parent = 0x "+Integer.toHexString(parent));
- /// M: @}
- if (storageID == 0xFFFFFFFF) {
- // query all stores
- if (format == 0) {
- // query all formats
- if (parent == 0) {
- // query all objects
- where = null;
- whereArgs = null;
- } else {
- if (parent == 0xFFFFFFFF) {
- // all objects in root of store
- parent = 0;
- }
- where = PARENT_WHERE;
- whereArgs = new String[] { Integer.toString(parent) };
- }
- } else {
- // query specific format
- if (parent == 0) {
- // query all objects
- where = FORMAT_WHERE;
- whereArgs = new String[] { Integer.toString(format) };
- } else {
- if (parent == 0xFFFFFFFF) {
- // all objects in root of store
- parent = 0;
- }
- where = FORMAT_PARENT_WHERE;
- whereArgs = new String[] { Integer.toString(format),
- Integer.toString(parent) };
- }
- }
- } else {
- // query specific store
- if (format == 0) {
- // query all formats
- if (parent == 0) {
- // query all objects
- where = STORAGE_WHERE;
- whereArgs = new String[] { Integer.toString(storageID) };
- } else {
- /*wanchengguo add 20180711 在PC上只显示指定文件夹begin*/
- /*if (parent == 0xFFFFFFFF) {
- // all objects in root of store
- parent = 0;
- }
- where = FORMAT_PARENT_WHERE;
- */
- if (parent == 0xFFFFFFFF) {
- // all objects in root of store
- parent = 0;
- String filename;//,"file_name in ('DCIM','Log','Movies')"
- filename = Settings.System.getString(mContext.getContentResolver(), "filename");
- Log.e("wanchengguo", "580filename="+filename);
- Log.e("wanchengguo", "270filename="+filename);
- SXlog.i("wanchengguo", "filename = "+filename);
- if(filename==""){
- filename = "'DCIM','Picture','Movies'";
- }
- SXlog.i("wanchengguo", "lengthDeviceName = "+filename.length());
- if(filename.length()>0) {
- where = STORAGE_PARENT_WHERE+ " AND " +"file_name in ("+filename+")";
- }else{
- where = STORAGE_PARENT_WHERE;
- }
- } else{
- // code by WenYF
- where = STORAGE_PARENT_WHERE;
- }
- /*wanchengguo add 20180711 在PC上只显示指定文件夹end*/
- whereArgs = new String[] { Integer.toString(storageID),
- Integer.toString(parent) };
- }
- } else {
- // query specific format
- if (parent == 0) {
- // query all objects
- where = STORAGE_FORMAT_WHERE;
- whereArgs = new String[] { Integer.toString(storageID),
- Integer.toString(format) };
- } else {
- if (parent == 0xFFFFFFFF) {
- // all objects in root of store
- parent = 0;
- }
- where = STORAGE_FORMAT_PARENT_WHERE;
- whereArgs = new String[] { Integer.toString(storageID),
- Integer.toString(format),
- Integer.toString(parent) };
- }
- }
- }
- // if we are restricting queries to mSubDirectories, we need to add the restriction
- // onto our "where" arguments
- if (mSubDirectoriesWhere != null) {
- /// M: Added for USB Develpment debug, more log for more debuging help
- SXlog.i(TAG, "createObjectQuery: mSubDirectoriesWhere = "+mSubDirectoriesWhere);
- if (where == null) {
- where = mSubDirectoriesWhere;
- whereArgs = mSubDirectoriesWhereArgs;
- } else {
- where = where + " AND " + mSubDirectoriesWhere;
- // create new array to hold whereArgs and mSubDirectoriesWhereArgs
- String[] newWhereArgs =
- new String[whereArgs.length + mSubDirectoriesWhereArgs.length];
- int i, j;
- for (i = 0; i < whereArgs.length; i++) {
- newWhereArgs[i] = whereArgs[i];
- }
- for (j = 0; j < mSubDirectoriesWhereArgs.length; i++, j++) {
- newWhereArgs[i] = mSubDirectoriesWhereArgs[j];
- }
- whereArgs = newWhereArgs;
- }
- } else {
- /// M: Added for USB Develpment debug, more log for more debuging help
- SXlog.e(TAG, "createObjectQuery: mSubDirectoriesWhere = null");
- }
- return mMediaProvider.query(mPackageName, mObjectsUri, ID_PROJECTION, where,
- whereArgs, null, null);
- }
重命名文件 在renameFile()中
- private static final String[] PATH_PROJECTION = new String[] {
- Files.FileColumns._ID, // 0
- Files.FileColumns.DATA, // 1
- Files.FileColumns.PARENT,//2 ADD Files.FileColumns.PARENT 目的是禁止修改头层文件名 wanchengguo 20180716
- };
- private int renameFile(int handle, String newName) {
- Cursor c = null;
- // first compute current path
- String path = null;
- int parent = -1;//禁止修改头层文件名 wanchengguo 20180716
- String[] whereArgs = new String[] { Integer.toString(handle) };
- try {
- c = mMediaProvider.query(mPackageName, mObjectsUri, PATH_PROJECTION, ID_WHERE,
- whereArgs, null, null);
- if (c != null && c.moveToNext()) {
- path = c.getString(1);
- parent = c.getInt(2);//禁止修改头层文件名 wanchengguo 20180716
- }
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException in getObjectFilePath", e);
- return MtpConstants.RESPONSE_GENERAL_ERROR;
- } finally {
- if (c != null) {
- c.close();
- }
- }
- if (path == null) {
- return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE;
- }
- // do not allow renaming any of the special subdirectories
- SXlog.e("wanchengguo", "path "+path);
- //path = /storage/emulated/0/Movies
- if (isStorageSubDirectory(path)) {
- //&&path=="/storage/emulated/0/Movies"
- return MtpConstants.RESPONSE_OBJECT_WRITE_PROTECTED;
- }
- String renamefile = Settings.System.getString(mContext.getContentResolver(), "renamefile");
- int lengthReName = renamefile.length();
- SXlog.i("wanchengguo", "lengthReName = "+lengthReName);
- if(parent != -1&&renamefile.length()>0&&renamefile.contains(path)){//parent == 0是头层文件 !=-1是所有文件 禁止修改文件名 wanchengguo 20180716
- return MtpConstants.RESPONSE_OBJECT_WRITE_PROTECTED;
- }
- // now rename the file. make sure this succeeds before updating database
- File oldFile = new File(path);
- int lastSlash = path.lastIndexOf('/');
- if (lastSlash <= 1) {
- return MtpConstants.RESPONSE_GENERAL_ERROR;
- }
- String newPath = path.substring(0, lastSlash + 1) + newName;
- File newFile = new File(newPath);
- boolean success = oldFile.renameTo(newFile);
禁止删除文件 deleteFile(int handle)
- private static final String[] PATH_FORMAT_PROJECTION = new String[] {
- Files.FileColumns._ID, // 0
- Files.FileColumns.DATA, // 1
- Files.FileColumns.FORMAT, // 2
- Files.FileColumns.FORMAT, // 3 add Files.FileColumns.FORMAT 禁止删除头层文件夹 wanchengguo 20180716
- private int deleteFile(int handle) {
- mDatabaseModified = true;
- String path = null;
- int format = 0;
- int parent = -1;//禁止删除头层文件夹 wanchengguo 20180716
- /// M: Added for USB Develpment debug, more log for more debuging help
- SXlog.d(TAG, "deleteFile: handle = 0x"+ Integer.toHexString(handle));
- /// M: Added for USB Develpment debug, more log for more debuging help
- Cursor c = null;
- try {
- c = mMediaProvider.query(mPackageName, mObjectsUri, PATH_FORMAT_PROJECTION,
- ID_WHERE, new String[] { Integer.toString(handle) }, null, null);
- if (c != null && c.moveToNext()) {
- // don't convert to media path here, since we will be matching
- // against paths in the database matching /data/media
- path = c.getString(1);
- format = c.getInt(2);
- parent = c.getInt(3);//禁止删除头层文件夹 wanchengguo 20180716
- } else {
- return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE;
- }
- if (path == null || format == 0) {
- return MtpConstants.RESPONSE_GENERAL_ERROR;
- }
- String deletenamefile = Settings.System.getString(mContext.getContentResolver(), "deletenamefile");
- SXlog.e("wanchengguo", "953renamefile.contains(path) "+deletenamefile.contains(path));
- int lengthDeleteName = deletenamefile.length();
- SXlog.i("wanchengguo", "lengthDeleteName = "+lengthDeleteName);
- //禁止删除头层文件夹 wanchengguo 20180716 begin
- if (parent != -1&&deletenamefile.length()>0&&deletenamefile.contains(path)) {
- // return MtpConstants.RESPONSE_ACCESS_DENIED;
- return MtpConstants.RESPONSE_GENERAL_ERROR;
- }
- //禁止删除头层文件夹 wanchengguo 20180716 end
更多相关文章
- android 驱动文件权限设置
- Android zip文件压缩解压
- xml文件中xmlns含义
- android中webView JS调用Android的方法、webView的下拉刷新(Swipe
- Android根据文件路径加载指定文件
- Android 7.0 使用FileProvider 在应用间共享文件
- android 实用sax 读取xml文件内容
- Android 打开相机、相册获取图片文件,支持Android 9.0系统
- 解决 android 在sd卡新建文件后需要重启才能找到