Диалоговое окно подтверждения разрешения хоста

Я хочу использовать Android в промышленности,

Я могу подключиться к Profilic и Ftdi USB для последовательных чипов с библиотекой slickdevlabs.com без каких-либо проблем.

Приложение имеет сервис и запускается при загрузке, подключается к последовательному порту USB и выполняет другие действия.

моя проблема в том, что хост-устройство не имеет никакого взаимодействия с пользователем,

поэтому, когда андроид спрашивает

Allow the app "MyAPP" to access the USB device ? [checkmark]Use by default for this USB device Cancel OK 

нет человека, который бы нажал на ok.

даже если я проверю использование по умолчанию …. Если я снова вставляю USB или перезагружаю хост-устройство, он снова запрашивает следующую загрузку.

Я запускал службу и приложение с режимом SuperUser, но никакой разницы, он снова спрашивает.

Я добавил фильтр намерений, но никакой разницы, он спрашивает меня каждый раз.

        

Любое мнение, как обходить или отключать его?

У меня есть root и SU доступ.

Я знаю, что это немного поздно, но все же …

У меня была такая же проблема, и я думаю, что мне удалось ее решить. Существует служба, которую Android использует внутри, что позволяет управлять USB-устройствами и аксессуарами. Эта служба скрыта от сторонних разработчиков и не документирована. Если вы проверите исходный код для UsbPermissionActivity, вы сможете выяснить, как называется эта услуга. Для вызова службы используются интерфейс IUsbManager и class ServiceManager. Они тоже скрыты, поэтому вы не можете использовать их напрямую. Но вы можете создавать свои заглушки с точно такими же именами и в соответствующих пространствах имен (пакетах). Тогда вы сможете скомпилировать этот код, в то время как среда выполнения будет использовать реальные вещи.

Единственное требованиеваше приложение должно быть системным, то есть оно должно быть расположено в каталоге / system / app /. Поскольку ваше устройство внедрено, это не должно быть проблемой.

Поэтому вам придется добавить пакет к вашему проекту: « android.hardware.usb » и поместить в него файл с именем « IUsbManager.java » со следующим содержимым:

 package android.hardware.usb; public interface IUsbManager extends android.os.IInterface { /** Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements android.hardware.usb.IUsbManager { /** Construct the stub at attach it to the interface. */ public Stub() { throw new RuntimeException( "Stub!" ); } /** * Cast an IBinder object into an android.hardware.usb.IUsbManager interface, * generating a proxy if needed. */ public static android.hardware.usb.IUsbManager asInterface( android.os.IBinder obj ) { throw new RuntimeException( "Stub!" ); } public android.os.IBinder asBinder() { throw new RuntimeException( "Stub!" ); } public boolean onTransact( int code, android.os.Parcel data, android.os.Parcel reply, int flags ) throws android.os.RemoteException { throw new RuntimeException( "Stub!" ); } static final int TRANSACTION_getDeviceList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); static final int TRANSACTION_openDevice = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); static final int TRANSACTION_getCurrentAccessory = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); static final int TRANSACTION_openAccessory = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); static final int TRANSACTION_setDevicePackage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); static final int TRANSACTION_setAccessoryPackage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); static final int TRANSACTION_hasDevicePermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); static final int TRANSACTION_hasAccessoryPermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7); static final int TRANSACTION_requestDevicePermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8); static final int TRANSACTION_requestAccessoryPermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9); static final int TRANSACTION_grantDevicePermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 10); static final int TRANSACTION_grantAccessoryPermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 11); static final int TRANSACTION_hasDefaults = (android.os.IBinder.FIRST_CALL_TRANSACTION + 12); static final int TRANSACTION_clearDefaults = (android.os.IBinder.FIRST_CALL_TRANSACTION + 13); static final int TRANSACTION_setCurrentFunction = (android.os.IBinder.FIRST_CALL_TRANSACTION + 14); static final int TRANSACTION_setMassStorageBackingFile = (android.os.IBinder.FIRST_CALL_TRANSACTION + 15); } /* Returns a list of all currently attached USB devices */ public void getDeviceList( android.os.Bundle devices ) throws android.os.RemoteException; /* Returns a file descriptor for communicating with the USB device. * The native fd can be passed to usb_device_new() in libusbhost. */ public android.os.ParcelFileDescriptor openDevice( java.lang.String deviceName ) throws android.os.RemoteException; /* Returns the currently attached USB accessory */ public android.hardware.usb.UsbAccessory getCurrentAccessory() throws android.os.RemoteException; /* Returns a file descriptor for communicating with the USB accessory. * This file descriptor can be used with standard Java file operations. */ public android.os.ParcelFileDescriptor openAccessory( android.hardware.usb.UsbAccessory accessory ) throws android.os.RemoteException; /* Sets the default package for a USB device * (or clears it if the package name is null) */ public void setDevicePackage( android.hardware.usb.UsbDevice device, java.lang.String packageName ) throws android.os.RemoteException; /* Sets the default package for a USB accessory * (or clears it if the package name is null) */ public void setAccessoryPackage( android.hardware.usb.UsbAccessory accessory, java.lang.String packageName ) throws android.os.RemoteException; /* Returns true if the caller has permission to access the device. */ public boolean hasDevicePermission(android.hardware.usb.UsbDevice device) throws android.os.RemoteException; /* Returns true if the caller has permission to access the accessory. */ public boolean hasAccessoryPermission( android.hardware.usb.UsbAccessory accessory ) throws android.os.RemoteException; /* Requests permission for the given package to access the device. * Will display a system dialog to query the user if permission * had not already been given. */ public void requestDevicePermission( android.hardware.usb.UsbDevice device, java.lang.String packageName, android.app.PendingIntent pi ) throws android.os.RemoteException; /* Requests permission for the given package to access the accessory. * Will display a system dialog to query the user if permission * had not already been given. Result is returned via pi. */ public void requestAccessoryPermission( android.hardware.usb.UsbAccessory accessory, java.lang.String packageName, android.app.PendingIntent pi ) throws android.os.RemoteException; /* Grants permission for the given UID to access the device */ public void grantDevicePermission( android.hardware.usb.UsbDevice device, int uid ) throws android.os.RemoteException; /* Grants permission for the given UID to access the accessory */ public void grantAccessoryPermission( android.hardware.usb.UsbAccessory accessory, int uid ) throws android.os.RemoteException; /* Returns true if the USB manager has default preferences or permissions for the package */ public boolean hasDefaults( java.lang.String packageName ) throws android.os.RemoteException; /* Clears default preferences and permissions for the package */ public void clearDefaults( java.lang.String packageName ) throws android.os.RemoteException; /* Sets the current USB function. */ public void setCurrentFunction( java.lang.String function, boolean makeDefault ) throws android.os.RemoteException; /* Sets the file path for USB mass storage backing file. */ public void setMassStorageBackingFile( java.lang.String path ) throws android.os.RemoteException; } 

Затем другой пакет: « android.os » с « ServiceManager.java »:

 package android.os; import java.util.Map; public final class ServiceManager { public static IBinder getService( String name ) { throw new RuntimeException( "Stub!" ); } /** * Place a new @a service called @a name into the service * manager. * * @param name the name of the new service * @param service the service object */ public static void addService( String name, IBinder service ) { throw new RuntimeException( "Stub!" ); } /** * Retrieve an existing service called @a name from the * service manager. Non-blocking. */ public static IBinder checkService( String name ) { throw new RuntimeException( "Stub!" ); } public static String[] listServices() throws RemoteException { throw new RuntimeException( "Stub!" ); } /** * This is only intended to be called when the process is first being brought * up and bound by the activity manager. There is only one thread in the process * at that time, so no locking is done. * * @param cache the cache of service references * @hide */ public static void initServiceCache( Map cache ) { throw new RuntimeException( "Stub!" ); } } 

Обратите внимание, что интерфейсы этих classов могут меняться в зависимости от версии Android. В моем случае версия 4.0.3 . Поэтому, если у вас есть другая версия Android, и этот код не работает, вам нужно будет проверить исходный код для вашей конкретной версии ОС.

Ниже приведен пример использования службы для предоставления разрешений всем устройствам FTDI:

 import java.util.HashMap; import java.util.Iterator; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.hardware.usb.IUsbManager; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.IBinder; import android.os.ServiceManager; public class LaunchReceiver extends BroadcastReceiver { public void onReceive( Context context, Intent intent ) { String action = intent.getAction(); if( action != null && action.equals( Intent.ACTION_BOOT_COMPLETED ) ) { try { PackageManager pm = context.getPackageManager(); ApplicationInfo ai = pm.getApplicationInfo( YOUR_APP_PACKAGE_NAMESPACE, 0 ); if( ai != null ) { UsbManager manager = (UsbManager) context.getSystemService( Context.USB_SERVICE ); IBinder b = ServiceManager.getService( Context.USB_SERVICE ); IUsbManager service = IUsbManager.Stub.asInterface( b ); HashMap deviceList = manager.getDeviceList(); Iterator deviceIterator = deviceList.values().iterator(); while( deviceIterator.hasNext() ) { UsbDevice device = deviceIterator.next(); if( device.getVendorId() == 0x0403 ) { service.grantDevicePermission( device, ai.uid ); service.setDevicePackage( device, YOUR_APP_PACKAGE_NAMESPACE ); } } } } catch( Exception e ) { trace( e.toString() ); } } } } 

Еще одна вещь – вам придется добавить к вашему манифесту следующее разрешение (Lint может не понравиться, но вы всегда можете изменить уровень серьезности в свойствах вашего проекта):

  

@d_d_t aswer отлично, но он не работает над новым 4.2.2. Используйте этот интерфейс:

 public interface IUsbManager extends android.os.IInterface { /** Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements android.hardware.usb.IUsbManager { private static final java.lang.String DESCRIPTOR = "android.hardware.usb.IUsbManager"; /** Construct the stub at attach it to the interface. */ public Stub() { throw new RuntimeException( "Stub!" ); } /** * Cast an IBinder object into an android.hardware.usb.IUsbManager * interface, generating a proxy if needed. */ public static android.hardware.usb.IUsbManager asInterface( android.os.IBinder obj) { throw new RuntimeException( "Stub!" ); } @Override public android.os.IBinder asBinder() { throw new RuntimeException( "Stub!" ); } @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { throw new RuntimeException( "Stub!" ); } static final int TRANSACTION_getDeviceList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); static final int TRANSACTION_openDevice = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); static final int TRANSACTION_getCurrentAccessory = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); static final int TRANSACTION_openAccessory = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); static final int TRANSACTION_setDevicePackage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); static final int TRANSACTION_setAccessoryPackage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); static final int TRANSACTION_hasDevicePermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); static final int TRANSACTION_hasAccessoryPermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7); static final int TRANSACTION_requestDevicePermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8); static final int TRANSACTION_requestAccessoryPermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9); static final int TRANSACTION_grantDevicePermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 10); static final int TRANSACTION_grantAccessoryPermission = (android.os.IBinder.FIRST_CALL_TRANSACTION + 11); static final int TRANSACTION_hasDefaults = (android.os.IBinder.FIRST_CALL_TRANSACTION + 12); static final int TRANSACTION_clearDefaults = (android.os.IBinder.FIRST_CALL_TRANSACTION + 13); static final int TRANSACTION_setCurrentFunction = (android.os.IBinder.FIRST_CALL_TRANSACTION + 14); static final int TRANSACTION_setMassStorageBackingFile = (android.os.IBinder.FIRST_CALL_TRANSACTION + 15); static final int TRANSACTION_allowUsbDebugging = (android.os.IBinder.FIRST_CALL_TRANSACTION + 16); static final int TRANSACTION_denyUsbDebugging = (android.os.IBinder.FIRST_CALL_TRANSACTION + 17); } /* Returns a list of all currently attached USB devices */ public void getDeviceList(android.os.Bundle devices) throws android.os.RemoteException; /* * Returns a file descriptor for communicating with the USB device. The * native fd can be passed to usb_device_new() in libusbhost. */ public android.os.ParcelFileDescriptor openDevice( java.lang.String deviceName) throws android.os.RemoteException; /* Returns the currently attached USB accessory */ public android.hardware.usb.UsbAccessory getCurrentAccessory() throws android.os.RemoteException; /* * Returns a file descriptor for communicating with the USB accessory. This * file descriptor can be used with standard Java file operations. */ public android.os.ParcelFileDescriptor openAccessory( android.hardware.usb.UsbAccessory accessory) throws android.os.RemoteException; /* * Sets the default package for a USB device (or clears it if the package * name is null) */ public void setDevicePackage(android.hardware.usb.UsbDevice device, java.lang.String packageName, int userId) throws android.os.RemoteException; /* * Sets the default package for a USB accessory (or clears it if the package * name is null) */ public void setAccessoryPackage( android.hardware.usb.UsbAccessory accessory, java.lang.String packageName, int userId) throws android.os.RemoteException; /* Returns true if the caller has permission to access the device. */ public boolean hasDevicePermission(android.hardware.usb.UsbDevice device) throws android.os.RemoteException; /* Returns true if the caller has permission to access the accessory. */ public boolean hasAccessoryPermission( android.hardware.usb.UsbAccessory accessory) throws android.os.RemoteException; /* * Requests permission for the given package to access the device. Will * display a system dialog to query the user if permission had not already * been given. */ public void requestDevicePermission(android.hardware.usb.UsbDevice device, java.lang.String packageName, android.app.PendingIntent pi) throws android.os.RemoteException; /* * Requests permission for the given package to access the accessory. Will * display a system dialog to query the user if permission had not already * been given. Result is returned via pi. */ public void requestAccessoryPermission( android.hardware.usb.UsbAccessory accessory, java.lang.String packageName, android.app.PendingIntent pi) throws android.os.RemoteException; /* Grants permission for the given UID to access the device */ public void grantDevicePermission(android.hardware.usb.UsbDevice device, int uid) throws android.os.RemoteException; /* Grants permission for the given UID to access the accessory */ public void grantAccessoryPermission( android.hardware.usb.UsbAccessory accessory, int uid) throws android.os.RemoteException; /* * Returns true if the USB manager has default preferences or permissions * for the package */ public boolean hasDefaults(java.lang.String packageName, int userId) throws android.os.RemoteException; /* Clears default preferences and permissions for the package */ public void clearDefaults(java.lang.String packageName, int userId) throws android.os.RemoteException; /* Sets the current USB function. */ public void setCurrentFunction(java.lang.String function, boolean makeDefault) throws android.os.RemoteException; /* Sets the file path for USB mass storage backing file. */ public void setMassStorageBackingFile(java.lang.String path) throws android.os.RemoteException; /* * Allow USB debugging from the attached host. If alwaysAllow is true, add * the the public key to list of host keys that the user has approved. */ public void allowUsbDebugging(boolean alwaysAllow, java.lang.String publicKey) throws android.os.RemoteException; /* Deny USB debugging from the attached host */ public void denyUsbDebugging() throws android.os.RemoteException; } 

И измените код, добавив идентификатор пользователя:

 ... service.setDevicePackage( usbDevice, YOUR_APP_PACKAGE_NAMESPACE, ai.uid ); .... 

Если у вас есть возможность скомпилировать систему Android, то вы ничего не можете сделать.

Можете добавить

 public void onStart() { super.onStart(); mPermissionGranted = true; finish(); } 

к frameworks / base / packages / SystemUI / src / com / android / systemui / usb / UsbPermissionActivity.java

чтобы обойти всплывающее окно подтверждения разрешения.

У меня была такая же проблема со всплывающим окном, и никто не нажимал на нее. Но я нашел другое решение (для корневых устройств). Всплывающее окно генерируется андроидом в classе UsbPermissionActivity (и что UsbPermissionActivity запускается с помощью UsbSettingsManager). Посмотрите на исходный код Android, чтобы узнать, что происходит. Хорошо, что мы можем манипулировать байт-кодом UsbPermissionActivity, чтобы принять все UsbDevices. Для этого нужен инструмент Smali / Baksmali . https://code.google.com/p/smali/

  1. Найдите файл SystemUI.apk на своем устройстве
  2. Скопируйте его на компьютер с помощью adb pull path/to/SystemUI.apk
  3. Распаковать apk
  4. Разберите файл java -jar baksmali.jar classes.dex с java -jar baksmali.jar classes.dex
  5. Найти файл UsbPermissionActivity и внутри него найти строку, которая говорит

    invoke-virtual {p0}, Lcom/android/systemui/usb/UsbPermissionActivity;->setupAlert()V

  6. Измените это, комментируя это и добавив две новые строки

#invoke-virtual {p0}, Lcom/android/systemui/usb/UsbPermissionActivity;->setupAlert()V const/4 v0, 0x1 iput-boolean v0, p0, Lcom/android/systemui/usb/UsbPermissionActivity;->mPermissionGranted:Z invoke-virtual {p0}, Lcom/android/systemui/usb/UsbPermissionActivity;->finish()V

  1. Соберите его с java -jar smali.jar -o classes.dex out
  2. Замените исходные classы.dex и снова заново запишите все в SystemUI.apk
  3. Замените исходный SystemUI.apk на вашем устройстве с помощью adb push services.jar path/to/SystemUI.apk или если это не работает с файловым менеджером ap

Android действительно не предназначен для поддержки такого использования из коробки. Лично для неинтерактивного использования у меня возникнет соблазн рассмотреть возможность использования последовательного драйвера USB в ядре linux и пропустить авизу USB-устройства Android. Но вы должны быть в состоянии серьезно изменить установку Android – изменить конфигурацию ядра и / или загрузить модуль, создать файлы устройств и установить их разрешения или владельцев, возможно, добавить группу unix и андроид для приложений, разрешенных для доступ к нему.

Или вы можете просмотреть источник android и отключить подтверждение пользователя; но если у вас нет исходной сборки Android для устройства, это может быть сложнее, чем идея уровня Linux, поскольку адаптация open-source android для работы на устройстве-поставщике может быть нетривиальной (если кто-то уже не предлагает от -source build, которая достаточно функциональна для рассматриваемого устройства)

Разумеется, доступ root / su не применяется к самим приложениям – это означает только то, что приложение, которое знает, как запускать любой инструмент, который корневой хак оставил после себя, может запустить вспомогательную программу, которая выполняется с правами root, но сама программа не не могу. Использование root для установки приложения в системном разделе может привести к некоторым нетипичным разрешениям андроида, но вам нужно будет проверить, есть ли какие-либо возможности, которые помогут вам с usb.

Согласно документации на Android Developers, у вас уже есть разрешение на подключенное USB-устройство, когда ваше приложение запускается через ваш фильтр манифеста. Возможно, вы должны попробовать этот подход и написать фильтр, чтобы точно соответствовать устройству, которое вы хотите использовать, чтобы другие приложения не хотели связываться с устройством.

См. «Примечание» на странице http://developer.android.com/guide/topics/connectivity/usb/host.html#permission-d

Один из способов добиться этого, обратите внимание, что это фактически не избавит от подтверждения, было бы определить местоположение checkbox и использовать эквивалент Android classа Robot, чтобы выбрать его, а затем выбрать OK . Вы можете написать приложение, которое работает в фоновом режиме, его даже можно вызвать из той службы запуска, о которой вы упомянули, специально для этой цели.

Я думаю, что белым списком аксессуара, который вы используете заранее, будет лучшее решение. Для этого вам нужно добавить файл usb_device_manager.xml в этом месте / data / system / users / 0
// Обратите внимание, что 0 – это идентификатор пользователя, вероятно, будет 0, если вы не добавили больше пользователей на Android, но если вы действительно изменили этот идентификатор

Вот как должен выглядеть файл:

     

Для такой платы http://www.embeddedartists.com/products/app/aoa_kit.php это:

       

Я думаю, мы можем сделать это, внеся некоторые изменения в /etc/udev . Мы могли бы добавить идентификатор поставщика и идентификатор устройства в файл 51-android.rules .

В первый раз, когда он нуждается в подтверждении, вы можете выбрать «всегда», тогда даже если устройство Android выключится и включится, ваше приложение все еще имеет разрешение на доступ к USB2Serial. Просто сказать, только один раз подтвердите!

У меня была та же проблема: всплывающее окно разрешения появляется каждый раз, когда я подключаю USB-кабель, для его решения я просто добавил фильтр в манифест и файл xml для VID и PID, просто убедитесь, что вы настроили фильтрацию USB-устройств, как это предлагается в ссылка SO выше или как описано здесь, и вы положили хороший VID и PID. Это была моя проблема, я не поставил VID и PID, которые соответствуют моему устройству

Если вы просто хотите скопировать / записать на USB-накопитель, вы можете использовать

следующий метод с помощью команд linx doCommand («mkdir / mnt / usbhost1 / dirname»)

 private boolean doCommand(String[] commands) { boolean ran = false; try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); for (String single : commands) { os.writeBytes(single + "\n"); os.flush(); } os.writeBytes("exit\n"); os.flush(); process.waitFor(); ran = true; } catch(Exception ex) { } return ran; } 

У меня есть следующие разрешения в моем манифесте, чтобы сожалеть, не помните, какие из них необходимы.

     

Если вы хотите сделать что-нибудь еще, это может быть вам не очень полезно

  • Ошибка ssh «разрешения слишком открыта»
  • Android-разрешение не работает, даже если я его объявил
  • Окно оверлей системы Android
  • npm ошибки установки с ошибкой: ENOENT, chmod
  • Разрешение отклонено в hdfs
  • Как я могу получить страшные разрешения WRITE_SECURE_SETTINGS для моего приложения для Android?
  • Правильный владелец / группа / разрешения для файлов / папок сайта Apache 2 в Mac OS X?
  • Разрешения на доступ к файлам IIS AppPoolIdentity и файловой системы
  • Разрешение отклонено (отсутствует разрешение INTERNET?): Но предоставляется разрешение
  • Разрешение перегрузки C ++
  • Как заставить приложение получать трансляцию, когда другие приложения установлены или удалены
  • Interesting Posts

    Предоставление разрешения на запись нескольким пользователям в папке в Ubuntu

    В OS X Lion LANG не настроен на UTF-8, как его исправить?

    Как узнать, имеет ли пользователь iPhone в настоящее время набор паролей и шифрование?

    Как центрировать камеру так, чтобы маркер находился в нижней части экрана? (Google map api V2 Android)

    jquery Event.stopPropagation (), похоже, не работает

    Удаление или удаление содержимого с карты (или любого другого контейнера STL) при повторном ее выполнении

    Лучший способ перечислить файлы на Java, отсортированные по дате Модифицированные?

    Измельчение файлов в окнах

    Загрузка видео с iPhone

    Разделитель Android / разделитель линии в макете?

    Могу ли я сделать функцию доступной в каждом controllerе в угловом?

    Pig Latin: загрузка нескольких файлов из диапазона дат (часть структуры каталогов)

    строка printf, элемент переменной длины

    Можете ли вы клонировать более крупный диск на меньший диск (используемое пространство подходит для меньшего размера)

    Почему C ++ не позволяет базовым classам реализовывать унаследованный интерфейс производного classа?

    Давайте будем гением компьютера.