android通过USB的MTP模式下,禁止用户在根目录有任何操作(例如删除文件夹)

废话不多说,直切主题

下文中所有注释了WenYF的,都是由作者添加


禁止添加文件夹:

找到frameworks/av/media/mtp中的MtpServer.cpp源文件

修改函数MtpResponseCode MtpServer::doSendObjectInfo()如下图



禁止修改文件夹名:

修改文件夹名,PC是先发了一个修改的event,然后再去得到文件属性,前一篇文章有说过在哪里得到,这里主要是不让其修改

frameworks/base/media/java/android/mtp/中找到MtpDatabase.java文件

1 修改查询映射


2 修改private int renameFile(int handle, String newName)如下图,如果是根目录就啥也不做



禁止删除文件夹

同上的MtpDatabase.java文件

1 和禁止修改类似,先修改查询映射



2  找到private int deleteFile(int handle) 同上的禁止一样,如果是根目录,啥也不做




上面三条可以理解为“增删改”

那么“查”应该是只在根目录显示指定的文件夹

如果你要这样做,如下:

在PC上只显示指定文件夹

1 添加一条查询string在field的静态域



2 在 private Cursor createObjectQuery(int storageID, int format, int parent)函数中,修改为

    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 {
                    if (parent == 0xFFFFFFFF) {
                        // all objects in root of store
                        parent = 0;

						// code by WenYF
						where = YISHOUJI_PARENT_WHERE;
                    } else{
                    	// code by WenYF
						where = STORAGE_PARENT_WHERE;
					}

					
                    //where = STORAGE_PARENT_WHERE;
                    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);
    }
其中parent为根目录,并且format为0,也就是说PC发来一条查询根目录对象有多少的指令后,这里查询数据库并对应返回



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值