2015-08-26 2 views
3

Я создаю инструмент командной строки с ndk и выполняю его в/data/local/tmp. Теперь это побуждает меня «требует android.permission.RECORD_AUDIO», когда я звоню некоторые OpenSLES API в моей командной строки инструмента:Как предоставить дополнительные разрешения пользователю оболочки Android?

W/AudioRecord(4226): AUDIO_INPUT_FLAG_FAST denied by client 
W/ServiceManager( 207): Permission failure: android.permission.RECORD_AUDIO from uid=2000 pid=4226 
E/  ( 207): Request requires android.permission.RECORD_AUDIO 
D/PowerManagerService( 964): handleSandman: canDream=false, mWakefulness=Asleep 
E/AudioFlinger( 207): openRecord() permission denied: recording not allowed 
E/AudioRecord(4226): AudioFlinger could not create record track, status: -1 
E/libOpenSLES(4226): android_audioRecorder_realize(0x453430) error creating AudioRecord object 
W/libOpenSLES(4226): Leaving Object::Realize (SL_RESULT_CONTENT_UNSUPPORTED) 

Я также попытался предоставить оболочку с грантом вечера:

pm grant "com.android.shell" android.permission.RECORD_AUDIO 
pm grant "com.android.shell" android.permission.RECORD_AUDIO 
pm grant "com.android.shell" android.permission.RECORD_AUDIO 
Operation not allowed: java.lang.SecurityException: Package com.android.shell has not requested permission android.permission.RECORD_AUDIO 

изменения /system/etc/permissions/platform.xml тоже не имеет эффекта.

Могу ли я просто отладить мою демонстрационную версию OpenSLES в оболочке Android? Как я могу получить больше разрешений только в оболочке.

Должен ли я создавать jni и java-проект для каждого экспериментального фрагмента кода и изменять их вместе при изменении некоторых интерфейсов на C++?

Могу ли я получить доступ к RECORD_AUDIO, CAMERA непосредственно в командном инструменте из оболочки?

+0

@Samveen У вас есть сообщение о запуске приложения C++ в оболочке android. Вы знаете, как предоставить разрешения для приложения C++? – skywind3000

+0

Да, вы можете запустить его как суперпользователь. Для этого вам нужно укоренившееся устройство. –

ответ

4

Это new permissions model in Android Marshmallow в действии. Чтобы получить это разрешение, вам нужно предложить пользователю предоставить его. Вот что я делаю:

  1. Всякий раз, когда мне нужно разрешение RECORD_AUDIO выполнить проверку, чтобы увидеть, если у меня есть это:

    private boolean hasRecordAudioPermission(){ 
        boolean hasPermission = (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED); 
    
        log("Has RECORD_AUDIO permission? " + hasPermission); 
        return hasPermission; 
    } 
    
  2. Если у меня нет его, то просить его

    private void requestRecordAudioPermission(){ 
    
        String requiredPermission = Manifest.permission.RECORD_AUDIO; 
    
        // If the user previously denied this permission then show a message explaining why 
        // this permission is needed 
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
          requiredPermission)) { 
    
         showToast("This app needs to record audio through the microphone...."); 
        } 
    
        // request the permission. 
        ActivityCompat.requestPermissions(this, 
          new String[]{requiredPermission}, 
          PERMISSIONS_REQUEST_RECORD_AUDIO); 
    } 
    
    @Override 
    public void onRequestPermissionsResult(int requestCode, 
                 String permissions[], int[] grantResults) { 
    
        // This method is called when the user responds to the permissions dialog 
    }