2017-10-27 15 views
1

AndroidのAudioRecord機能の使用を許可するクラスを作成しています。以下のコードでは、アプリケーションコンテキストとして何を配置しますか(android app)

このクラスは、メインアクティビティクラスとは別のクラスです。このクラスの名前はRecordAudioPermissionで、関連コードは下部にリストされています。私が抱えている問題は、関連するメソッドの引数にコンテキストをどのように置くべきかわからないということです。私は 'this'、 'Activity.getContext()'、 'RecordAudioPermission.getContext()'などのような通常のソリューションを試しましたが、動作していないようです。

問題コードを明確にするために、コードブロックに矢印>> [コード] < <とハイライト表示しました。

public class RecordAudioPermission { 

    android.media.AudioRecord RecordAudio = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, CHANNEL_IN_MONO, ENCODING_PCM_16BIT, AudioRecord.getMinBufferSize(44100, CHANNEL_IN_MONO, ENCODING_PCM_16BIT)); 


    int MY_PERMISSIONS_RECORD_AUDIO = 1; 


    private void RecordAudioPermission() { 

     if (ContextCompat.checkSelfPermission(Pitchpipe.getContext(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { 

      //When permission is not granted by user, show them message why this permission is needed. 
      if (ActivityCompat.shouldShowRequestPermissionRationale(Pitchpipe.getContext(), Manifest.permission.RECORD_AUDIO)) 
      { 
       Toast.makeText(Pitchpipe.getContext(), "Please grant permissions to record audio", Toast.LENGTH_LONG).show(); 

       //Give user option to still opt-in the permissions 
       ActivityCompat.requestPermissions(>>Pitchpipe.getContext()<<, new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO); 

      } 

      else { 
       // Show user dialog to grant permission to record audio 
       ActivityCompat.requestPermissions(>>Pitchpipe.getContext()<<, new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO); 
      } 
     } 

     //If permission is granted, then go ahead recording audio 

     else if (ContextCompat.checkSelfPermission(Pitchpipe.getContext(), Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) { 

      //Go ahead with recording audio now 
      RecordAudio.startRecording(); 

     } 

    } 

} 

私のためのコンテキストを取得し、私は私のアプリ(ピッチパイプ)と同じ名前の別のクラスを作成することである(方法のいくつかのためにその仕事、すべてではないが、)試してみましたが、最新のソリューション。

public class Pitchpipe extends Application { 
    private static Pitchpipe instance; 

    public static Pitchpipe getInstance() { 
     return instance; 
    } 

    public static Context getContext(){ 
     return instance; 
     // or return instance.getApplicationContext(); 
    } 

    @Override 
    public void onCreate() { 
     instance = this; 
     super.onCreate(); 
    } 
} 

とAndroidマニフェスト内のタグにこれを追加する:次いで

android:name="com.example.remyryszkowski.pitchpipe.Pitchpipe" 

とコンテキストの

Pitchpipe.getContext() 

を置きます。

私はこの一見単純なことをやって、私のギターチューナーアプリは(理論的に)完了するので、どんな助けも大歓迎です。

注:私はJava、Android、および一般的なコーディングには新しく、私は約3ヶ月間初めてのアプリを作っている間に学習してきました。

答えて

0

強調されたテキスト Context型のパラメータを受け取ってプライベート変数に格納するコンストラクタを作成する必要があります。あなたは、常にドキュメントごとに、アプリケーションの権限を確認するかのようにそれらを要求するコンテキストをする必要があります:

/** 
* Interface to global information about an application environment. This is 
* an abstract class whose implementation is provided by 
* the Android system. It 
* allows access to application-specific resources and classes, as well as 
* up-calls for application-level operations such as launching activities, 
* broadcasting and receiving intents, etc. 
*/ 
public abstract class Context { 
··· 
} 

Android API Reference Context

でだから、あなたはこのようなあなたのクラスを持っている必要があります:

public class RecordAudioPermission { 

    private Context mContext; 
    android.media.AudioRecord RecordAudio = ···; 


    int MY_PERMISSIONS_RECORD_AUDIO = 1; 

    public RecordAudioPermission(Context context){ 
     this.mContext = context; 
    } 

    public void RequestRecordAudioPermission() { 
     if (ContextCompat.checkSelfPermission(Pitchpipe.getContext(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { 

     //When permission is not granted by user, show them message why this permission is needed. 
      if (ActivityCompat.shouldShowRequestPermissionRationale(>>this.mContext<<, Manifest.permission.RECORD_AUDIO)){ 
       Toast.makeText(>>this.mContext<<, "Please grant permissions to record audio", Toast.LENGTH_LONG).show(); 

       //Give user option to still opt-in the permissions 
       ActivityCompat.requestPermissions(>>this.mContext<<, new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO); 

      } else { 
       // Show user dialog to grant permission to record audio 
       ActivityCompat.requestPermissions(>>this.mContext<<, new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO); 
      } 
     } 
     ··· 
    } 
} 

これがうまくいくと思います。

NOTE 方法のActivityCompat.requestPermissions引数の型活動であるあなたが、別の型を渡すしようとした場合、これはエラーになります。クラスを使用すると、コンテキストを渡すとpermissonチェックを実行することができ、静的メソッドを使用しているRecordAudioPermissionあなたを実装する

public class MainActivity extends Activity { 
    ··· 

    @Override 
    protected void onCreate(Bundle savedInstance){ 
    ··· 

    RecordAudioPermission mRecordAudioPermission = new RecordAudioPermission(this); 

    mRecordAudioPermission.requestRecordAudioPermission(); 

    ··· 
    } 

    ··· 
} 

別の方法:あなたのActivityクラス内でこのように進める必要があるでしょう、以前decribedクラスを使用するには /リクエスト:

public class RecordAudioPermission { 


    android.media.AudioRecord RecordAudio = ···; 


    int MY_PERMISSIONS_RECORD_AUDIO = 1; 

    public static void requestRecordAudioPermission(Context mContext) { 
     if (ContextCompat.checkSelfPermission(>>mContext<<, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { 

     //When permission is not granted by user, show them message why this permission is needed. 
      if (ActivityCompat.shouldShowRequestPermissionRationale(>>mContext<<, Manifest.permission.RECORD_AUDIO)){ 
       Toast.makeText(>>mContext<<, "Please grant permissions to record audio", Toast.LENGTH_LONG).show(); 

       //Give user option to still opt-in the permissions 
       ActivityCompat.requestPermissions(>>mContext<<, new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO); 

      } else { 
       // Show user dialog to grant permission to record audio 
       ActivityCompat.requestPermissions(>>mContext<<, new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO); 
      } 
     } 
     ··· 
    } 
} 

そして、あなたのActivityクラスの内部ビット単純です:

public class MainActivity extends Activity { 
    ··· 

    @Override 
    protected void onCreate(Bundle savedInstance){ 
    ··· 

    RecordAudioPermission.requestRecordAudioPermission(this); //§ 

    ··· 
    } 

    ··· 
} 

§あなたのアクティビティ、つまり、トーストメッセージを表示し、アクセス許可要求を実行するために必要なコンテキストオブジェクトを意味します。

関連する問題