2017-01-12 20 views
1

私はユーザーの介入なしにさまざまな電話機能をテストするためのアプリを作ったが、一部のデバイスでは機能していなかった。私の理論では、実行時のアクセス権が必要だと私は正しかった。アクティビティに実行時パーミッションを入れると、完全に動作します。問題は、ユーザーからのアクセス許可を要求し、ユーザーの操作ができないことです。ユーザーの操作なしでアクティビティにアクセス許可を与える方法はありますか?Android-Runtime Permissionにユーザーの操作が許可されていませんか?

私は、レコーダーアクティビティが動作する場所にアクティビティを含めますが、許可を与えるユーザーに依存します。助けてください!!それは権限の目的を否定してしまうため

public static final int RECORD_AUDIO_PERMISSION_REQUEST = 3; 



    @RequiresApi(api = Build.VERSION_CODES.M) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
       /* 
     * API's to launch the application when the tablet is locked or 
     * display is turned off 
     */ 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 
     setContentView(R.layout.activity_recorder); 

     //Check to see if the device has a microphone 
     PackageManager pm = getPackageManager(); 
     boolean micPresent = pm.hasSystemFeature(PackageManager.FEATURE_MICROPHONE); 
     if (!micPresent) { 
      Log.i(log_tag, "There is no microphone present in this device."); 
      exit_function(); 
     } else { 
      createTempFile(status_tag, "INPROGRESS"); 

      //Create the file to write the recording 
      try { 
       FileOutputStream fOut = openFileOutput("audio_test.3gp", MODE_WORLD_READABLE); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       Log.e(log_tag, "FAILED TO CREATE THE FILE OUTPUT STREAM"); 
       exit_function(); 
      } 

//   if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, RECORD_AUDIO_PERMISSION_REQUEST); 

      //start_recording(); 
     } 
    } 




    //Start the Recording 
    private void start_recording() { 
     if (recorder != null) { 
      recorder.stop(); 
      recorder.reset(); 
      recorder.release(); 
      recorder = null; 
     } 
     //Setting for the Recorder 
     try { 
      Log.i(log_tag, "Setting the recorder"); 
      //This is the path that the file will be saved 
      path = getFilesDir().getAbsolutePath() + "/audio_test.3gp"; 
      recorder = new MediaRecorder(); 
      recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
      recorder.setOutputFile(path); 

     } catch (Exception e) { 
      Log.e(log_tag, "Recording Settings Failed"); 
      exit_function(); 
     } 
     //Prepare the Recorder 
     try { 
      Log.i(log_tag, "Preparing the Recorder"); 
      recorder.prepare(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.e(log_tag, "Recording failed"); 
      exit_function(); 
     } 

     //Start the Recorder 
     try { 
      Log.i(log_tag, "Starting the recorder"); 
      title_text = ((TextView) findViewById(R.id.textView)); 
      title_text.setTextColor(Color.RED); 
      title_text.setText("RECORDING"); 
      recorder.start(); 

      //The recording lasts as long as he timer and then stops 
      mHandler.postDelayed(new Runnable() { 
       public void run() { 
        if (recorder != null) { 
         recorder.stop(); 
         recorder.reset(); 
         recorder.release(); 
         recorder = null; 
        } 
        Log.e(log_tag, "First Delay"); 
        exit_function(); 
       } 
      }, timer); 
      createTempFile(status_tag, "Complete"); 


     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.e(log_tag, "Recorder start failed"); 
      exit_function(); 
     } 
    } 
     @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case RECORD_AUDIO_PERMISSION_REQUEST: 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        start_recording(); 
       } else { 
        onDestroy(); 
       } 
      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
+5

**幸い**あなたが – Selvin

+0

できない、それは、自動的に無使用のランタイム許可のプロセス全体を、それを許可しなければならない場合。あなたのapiレベルを23未満にしてください。 –

+0

@Selvinは、幸いにも** un **を入れるのを忘れてしまったようですね:P –

答えて

4

コメントに記載されているように、これは一般的なAndroidアプリでは不可能で、明らかなセキュリティ上の理由から不可能です。

「さまざまな電話機能をテストする」ために、私たちはアプリを書くのではなく、計測テストを使ってテストスイートを作成します。 がある場合は、UiAutomatorを使用して権限ダイアログをクリックするのを自動化できます。ただし、これはAndroid SDKのインストールでテストスイートの一部としてのみ実行されます。

また、あなたのケースでは、targetSdkVersionを23未満に設定すると、実行時のアクセス権を処理する必要はありません。最終的には、あなたの手がそれよりも高いtargetSdkVersionを持つように強制するでしょうが、将来的にその挑戦に取り組むことができるかもしれません。

+0

これはちょうど私が来た結論です。少なくとも私は今問題を知っています。私は前に働いたときにこれがなぜうまくいかないのか理解しようと壁に頭を打ちつけていました。今私は問題を知っている。手伝ってくれてありがとう。 – Toby

0

残念ながら、これは、実行することはできません。

おそらく、あなたが物理的に許可ボックスの許可ボタンをタップできるアプリを書いたとします。他のアプリをオーバーレイしたり、画面上のものとやりとりすることができるもの。しかし、そのようなもので、私はあなたを助けることができません。

2

これはおそらくあなたが望むものではありませんが、ユーザーはあなたのアプリと対話せずに技術的に許可を与えることができます。 Android 6以降では、ユーザーは電話の[設定] - > [アプリ] - > [権限]の各権限を許可したり拒否したりできます。 技術的にはです。これにより、アプリケーションとやりとりすることなく許可が与えられます。

0

これは可能ですが、いくつかの制限があります。

1)22以上のsdkを使用する場合は、実行時のアクセス許可を求めるよりも、sdk 22以下を使用する必要があります。

  • アプリレベルに移動してtargetSdkVersion 22に移動します。

私はこの方法を試しました!

ここでは、サンプルプロジェクトのリンク: - https://github.com/kdblue/PermissionGranted

関連する問題