Androidストレージ、カメラ、録音権限チェック、小米、vivo、oppo、ハンマー、魅族、レノボなどの機種と6.0以下のシステムに適しています
5779 ワード
Android 6.0以上の検出権限用Activity Compat.checkSelfPermission(context,permissionCode)またはContextCompat.checkSelfPermission(context,permissionCode)
しかし、一部の携帯電話機では、権限がオンになっているかどうかにかかわらずPackageManagerに戻ります.PERMISSION_GRANTEDは、これらの機種に対して特別な処理を行い、同様の方法で6.0以下で権限を変更できる機種にも適用されます
次の機種が常にPackageManagerに戻ることが検出されました.PERMISSION_GRANTED、レノボ(lenovo)、赤米(xiaomi)、魅族(meizu)、ハンマー(smartisan)、vivo(vivo)、oppo(oppo)
1.携帯電話システムのバージョンが6.0以下かどうかを判断し、メーカーはこのいくつかの
2.1に該当する携帯電話についての特殊処理
(1)カメラ権限判断、カメラを開くことで撮影権限の有無を判断し、最終的にリソースを解放することを覚えておく
(2)録音権限判断は、録音を開始できるか否かによって録音権限の有無を判断し、最終的にリソースを解放することにも注意する
(3)記憶権限判断は、新規ファイルまたはフォルダを作成して新規ファイルまたはフォルダが存在するか否かを判断し、最後に削除する必要があるか否かの自己判定
この方法で携帯電話でほぼカバーできるので、問題があったら伝言してください.
private static boolean hasPermission(Context context, String permissionCode) {
MyLog.e("permission", "permissionCode:" + permissionCode);
try {
MyLog.e("permission", "checkSelfPermission:" + (ActivityCompat.checkSelfPermission(context, permissionCode) == PackageManager.PERMISSION_GRANTED));
return ActivityCompat.checkSelfPermission(context, permissionCode) == PackageManager.PERMISSION_GRANTED;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
しかし、一部の携帯電話機では、権限がオンになっているかどうかにかかわらずPackageManagerに戻ります.PERMISSION_GRANTEDは、これらの機種に対して特別な処理を行い、同様の方法で6.0以下で権限を変更できる機種にも適用されます
次の機種が常にPackageManagerに戻ることが検出されました.PERMISSION_GRANTED、レノボ(lenovo)、赤米(xiaomi)、魅族(meizu)、ハンマー(smartisan)、vivo(vivo)、oppo(oppo)
1.携帯電話システムのバージョンが6.0以下かどうかを判断し、メーカーはこのいくつかの
private static boolean isSpecialDevice() {
MyLog.e("permission", "Build.BRAND:" + Build.BRAND);
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Build.BRAND.toLowerCase().equals("smartisan")
|| Build.BRAND.toLowerCase().equals("xiaomi") || Build.BRAND.toLowerCase().equals("oppo") || Build.BRAND.toLowerCase().equals("vivo")
|| Build.BRAND.toLowerCase().equals("lenovo") || Build.BRAND.toLowerCase().equals("meizu");
}
2.1に該当する携帯電話についての特殊処理
(1)カメラ権限判断、カメラを開くことで撮影権限の有無を判断し、最終的にリソースを解放することを覚えておく
public static boolean checkCameraPermission(Context context) {
try {
if (isSpecialDevice()) {
// ( 6.0 root )
boolean isCanUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open();
Camera.Parameters mParameters = mCamera.getParameters();
mCamera.setParameters(mParameters);
} catch (Exception e) {
isCanUse = false;
} finally {
if (mCamera != null) {
try {
mCamera.release();
} catch (Exception e) {
e.printStackTrace();
isCanUse = false;
} finally {
return isCanUse;
}
} else {
return false;
}
}
} else {
return hasPermission(context, Manifest.permission.CAMERA);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
(2)録音権限判断は、録音を開始できるか否かによって録音権限の有無を判断し、最終的にリソースを解放することにも注意する
public static boolean checkAudioPermission(Context context) {
try {
if (isSpecialDevice()) {
//
int audioSource = MediaRecorder.AudioSource.MIC;
// ,44100 , 22050,16000,11025
int sampleRateInHz = 44100;
// CHANNEL_IN_STEREO ,CHANNEL_CONFIGURATION_MONO
int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
// :PCM 16 。 。PCM 8 。 。
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
//
int bufferSizeInBytes;
boolean flag;
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);
//
try {
// ,
audioRecord.startRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
} finally {
/**
*
*/
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING)
flag = false;
else
flag = true;
audioRecord.stop();
audioRecord.release();
return flag;
}
} else {
return hasPermission(context, Manifest.permission.RECORD_AUDIO);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
(3)記憶権限判断は、新規ファイルまたはフォルダを作成して新規ファイルまたはフォルダが存在するか否かを判断し、最後に削除する必要があるか否かの自己判定
public static boolean checkStoragePermission(Context context) {
try {
if (isSpecialDevice()) {
String absolute_dir;
absolute_dir = Environment.getExternalStorageDirectory().toString() + "/temp/";
File f = new File(absolute_dir);
if (!f.exists())
f.mkdirs();
if (f.exists())
return true;
else
return false;
} else {
return hasPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
この方法で携帯電話でほぼカバーできるので、問題があったら伝言してください.