83 lines
2.8 KiB
JavaScript
83 lines
2.8 KiB
JavaScript
const { withAndroidManifest } = require('@expo/config-plugins');
|
|
|
|
const withUsbCamera = (config) => {
|
|
return withAndroidManifest(config, async (config) => {
|
|
const androidManifest = config.modResults;
|
|
|
|
if (!androidManifest.manifest['uses-feature']) {
|
|
androidManifest.manifest['uses-feature'] = [];
|
|
}
|
|
|
|
// Check if usb.host feature is already added
|
|
const featureExists = androidManifest.manifest['uses-feature'].some(
|
|
(f) => f.$['android:name'] === 'android.hardware.usb.host'
|
|
);
|
|
|
|
if (!featureExists) {
|
|
androidManifest.manifest['uses-feature'].push({
|
|
$: {
|
|
'android:name': 'android.hardware.usb.host',
|
|
'android:required': 'false',
|
|
},
|
|
});
|
|
}
|
|
|
|
// Add intent-filter to MainActivity
|
|
const application = androidManifest.manifest.application[0];
|
|
const mainActivity = application.activity.find((activity) => {
|
|
const isMainActivity = activity['intent-filter']?.some((filter) => {
|
|
return filter.action?.some((action) => action.$['android:name'] === 'android.intent.action.MAIN');
|
|
});
|
|
return isMainActivity;
|
|
});
|
|
|
|
if (mainActivity) {
|
|
const hasUsbIntent = mainActivity['intent-filter']?.some((filter) => {
|
|
return filter.action?.some((action) => action.$['android:name'] === 'android.hardware.usb.action.USB_DEVICE_ATTACHED');
|
|
});
|
|
|
|
if (!hasUsbIntent) {
|
|
if (!mainActivity['intent-filter']) {
|
|
mainActivity['intent-filter'] = [];
|
|
}
|
|
mainActivity['intent-filter'].push({
|
|
action: [{ $: { 'android:name': 'android.hardware.usb.action.USB_DEVICE_ATTACHED' } }],
|
|
});
|
|
|
|
if (!mainActivity['meta-data']) {
|
|
mainActivity['meta-data'] = [];
|
|
}
|
|
mainActivity['meta-data'].push({
|
|
$: {
|
|
'android:name': 'android.hardware.usb.action.USB_DEVICE_ATTACHED',
|
|
'android:resource': '@xml/device_filter',
|
|
},
|
|
});
|
|
}
|
|
}
|
|
|
|
return config;
|
|
});
|
|
};
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const withUsbCameraXml = (config) => {
|
|
return require('@expo/config-plugins').withDangerousMod(config, [
|
|
'android',
|
|
async (config) => {
|
|
const resDir = path.join(config.modRequest.platformProjectRoot, 'app/src/main/res/xml');
|
|
if (!fs.existsSync(resDir)) {
|
|
fs.mkdirSync(resDir, { recursive: true });
|
|
}
|
|
const filterPath = path.join(resDir, 'device_filter.xml');
|
|
const xmlContent = `<?xml version="1.0" encoding="utf-8"?>\n<resources>\n <usb-device class="239" subclass="2" />\n <usb-device class="239" subclass="2" protocol="1" />\n <usb-device class="239" subclass="2" protocol="2" />\n</resources>`;
|
|
fs.writeFileSync(filterPath, xmlContent);
|
|
return config;
|
|
},
|
|
]);
|
|
};
|
|
|
|
module.exports = (config) => withUsbCameraXml(withUsbCamera(config));
|