6.0之前
/device/mediatek/common/device.mk
# default usb function ifeq ($(strip $(MTK_MASS_STORAGE)),yes)
ADDITIONAL_DEFAULT_PROPERTIES += persist.sys.usb.config=mass_storage
//修改上面成想要的功能腿箩,如 ADDITIONAL_DEFAULT_PROPERTIES += persist.sys.usb.config=mtp
6.0之后
MTK 在M版本將沿用Google的設(shè)計(jì)
由于改動(dòng)之后會(huì)有些副作用第岖,
所以MTK并不支持修改
沒辦法
客戶需要
根據(jù)彈出選擇USB 模式的界面可以看到 最終是通過UsbManager 進(jìn)行實(shí)現(xiàn)的,
那么我們可以在USB查吧的時(shí)候模擬點(diǎn)擊的是MTP
有了思路侵续,那么進(jìn)行改動(dòng)
mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP);
mUsbManager.setUsbDataUnlocked(true);
既然會(huì)發(fā)送通知,那么肯定會(huì)有接受USB插拔的廣播
StorageNotification.java
/*chc add */
private UsbManager mUsbManager;
int i=0;
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean available = (intent.getBooleanExtra(UsbManager.USB_CONFIGURED, false) &&
intent.getBooleanExtra(UsbManager.USB_FUNCTION_MASS_STORAGE, false));
Log.i(TAG, "onReceive=" + intent.getAction() + ",available=" + available);
/*chc add */
boolean connected = intent.getExtras().getBoolean("connected"); //進(jìn)行檢測(cè)USB是連接還是斷開的
Log.d(TAG, "connected="+connected);
if (!connected) {
i=0;
}else{
new Thread() {
public void run() {
try {
/*chc add */
if(i==0){ //USB插入之后會(huì)重復(fù)的進(jìn)行發(fā)送USB廣播憨闰,所以進(jìn)行處理状蜗,讓他只進(jìn)行一次設(shè)置。
i++;
Thread.sleep(500);
Log.d(TAG,"cuihangchao start()");
mUsbManager = mContext.getSystemService(UsbManager.class);
mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP);
mUsbManager.setUsbDataUnlocked(true);
}
} catch (Exception e) {
Log.d(TAG,"Exception="+e);
}
};
}.start();
}
/*chc end*/
onUsbMassStorageConnectionChangedAsync(available);
}
};
private final static String ACTION ="android.hardware.usb.action.USB_STATE"; //這是接受USB插拔廣播的Action
此方法只是模擬的進(jìn)行了一次MTP設(shè)置鹉动,所以會(huì)有BUG轧坎,當(dāng)手機(jī)還沒有開機(jī)就插入U(xiǎn)SB線的話,那么他并不會(huì)接受到這個(gè)廣播泽示,所以第一次還是僅充電缸血,只有開機(jī)之后才會(huì)起效
解決連接USB 開機(jī)設(shè)置MTP
SystemUIService.java
private UsbManager mUsbManager;
@Override
public void onCreate() {
super.onCreate();
((SystemUIApplication) getApplication()).startServicesIfNeeded();
/*chc add */
new Thread() {
public void run() {
try {
Thread.sleep(15000);
Log.d("SystemUIService","onCreate cuihangchao");
mUsbManager =getSystemService(UsbManager.class);
mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP);
mUsbManager.setUsbDataUnlocked(true);
} catch (Exception e) {
Log.d("SystemUIService","Exception="+e);
}
};
}.start();
}
更新另一位大牛的寫法:http://blog.csdn.net/u012846789/article/details/73195335
適用android 7
8.1
image.png
@Override
public void handleMessage(Message msg) {
...
case MSG_UPDATE_STATE:
...
if (!mConnected) {
// restore defaults when USB is disconnected
setEnabledFunctions(null, !mAdbEnabled, false);
setEnabledFunctions(UsbManager.USB_FUNCTION_MTP, false, true); //chc
add
}
...
case MSG_BOOT_COMPLETED:
mBootCompleted = true;
if (mPendingBootBroadcast) {
updateUsbStateBroadcastIfNeeded(false);
mPendingBootBroadcast = false;
}
//setEnabledFunctions(null, false, false);
setEnabledFunctions(UsbManager.USB_FUNCTION_MTP, false, true); //chc add
if (mCurrentAccessory != null) {
getCurrentSettings().accessoryAttached(mCurrentAccessory);
}
if (mDebuggingManager != null) {
mDebuggingManager.setAdbEnabled(mAdbEnabled);
}
break;
}
連接電腦蜜氨,看電腦上MTP的圖標(biāo)顯示之后,然后將延遲進(jìn)行相應(yīng)的調(diào)整
此問題到此結(jié)束