废话不多说,直切主题
下文中所有注释了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发来一条查询根目录对象有多少的指令后,这里查询数据库并对应返回