shu*_*003 8 android android-permissions android-6.0-marshmallow
有没有办法在没有root权限的情况下以编程方式回答Android 6.0中的来电?我尝试了以下方法:
android.permission.MODIFY_PHONE_STATE
在Android 6.0中未提供给第三方应用.希望这会有所帮助:)
public void acceptCall() {
if (Build.VERSION.SDK_INT >= 21) {
Intent answerCalintent = new Intent(context, AcceptCallActivity.class);
answerCalintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
answerCalintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(answerCalintent);
} else {
Intent intent = new Intent(context, AcceptCallActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
Run Code Online (Sandbox Code Playgroud)
AcceptCallActivity.java
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.KeyEvent;
import android.view.WindowManager;
import java.io.IOException;
import java.util.logging.Logger;
public class AcceptCallActivity extends Activity {
private static Logger logger = Logger.getLogger(String.valueOf(AcceptCallActivity.class));
private static final String MANUFACTURER_HTC = "HTC";
private KeyguardManager keyguardManager;
private AudioManager audioManager;
private CallStateReceiver callStateReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
registerCallStateReceiver();
updateWindowFlags();
acceptCall();
}
@Override
protected void onPause() {
super.onPause();
if (callStateReceiver != null) {
unregisterReceiver(callStateReceiver);
callStateReceiver = null;
}
}
private void registerCallStateReceiver() {
callStateReceiver = new CallStateReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
registerReceiver(callStateReceiver, intentFilter);
}
private void updateWindowFlags() {
if (keyguardManager.inKeyguardRestrictedInputMode()) {
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
} else {
getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}
}
private void acceptCall() {
// for HTC devices we need to broadcast a connected headset
boolean broadcastConnected = MANUFACTURER_HTC.equalsIgnoreCase(Build.MANUFACTURER)
&& !audioManager.isWiredHeadsetOn();
if (broadcastConnected) {
broadcastHeadsetConnected(false);
}
try {
try {
// logger.debug("execute input keycode headset hook");
Runtime.getRuntime().exec("input keyevent " +
Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));
} catch (IOException e) {
// Runtime.exec(String) had an I/O problem, try to fall back
// logger.debug("send keycode headset hook intents");
String enforcedPerm = "android.permission.CALL_PRIVILEGED";
Intent btnDown = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(
Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN,
KeyEvent.KEYCODE_HEADSETHOOK));
Intent btnUp = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(
Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP,
KeyEvent.KEYCODE_HEADSETHOOK));
sendOrderedBroadcast(btnDown, enforcedPerm);
sendOrderedBroadcast(btnUp, enforcedPerm);
}
} finally {
if (broadcastConnected) {
broadcastHeadsetConnected(false);
}
}
}
private void broadcastHeadsetConnected(boolean connected) {
Intent i = new Intent(Intent.ACTION_HEADSET_PLUG);
i.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
i.putExtra("state", connected ? 1 : 0);
i.putExtra("name", "mysms");
try {
sendOrderedBroadcast(i, null);
} catch (Exception e) {
}
}
private class CallStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
}
}
Run Code Online (Sandbox Code Playgroud)
已经测试了Marshmallow版本.
干杯!
小智 5
经过大量搜索后,我发布了在 Orasi 中使用的代码。希望这对很多程序员有所帮助...注意此代码是从具有其他功能的软件中提取的,因此某些代码可能并不在所有软件中使用。
\n\n首先,在所有 Android 版本上接听和结束通话的功能(没有 AIDL!):
\n\n/////////////////////////////////////////////////////////////////////////////////////\n// Controle le t\xc3\xa9l\xc3\xa9phone en utilisant des primitives selon les versions d\'OS\nprivate void PhoneControl(int nControl) {\n if(nControl == PHONE_END_CALL) { // End call, all Android version\n try {\n TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);\n if(tm == null)\n return;\n tm.getClass().getMethod("endCall").invoke(tm);\n bIsEnding = true;\n } catch (Exception e) { /* Do Nothing */ }\n }\n\n if(nControl == PHONE_ACCEPT_CALL) { // Accept phone call\n if(!bCallAccepted) { // Call d\xc3\xa9j\xc3\xa0 accept\xc3\xa9 => pas d\'action (\xc3\xa9vite double action)\n bCallAccepted = true;\n if(Build.VERSION.SDK_INT >= 26) { // Pris en charge Android >= 8.0\n if(checkSelfPermission("android.permission.ANSWER_PHONE_CALLS") == PackageManager.PERMISSION_GRANTED) {\n TelecomManager tm = (TelecomManager) this.getSystemService(Context.TELECOM_SERVICE);\n if(tm != null)\n tm.acceptRingingCall();\n }\n }\n if(Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 26) { // Hangup in Android 6.x and 7.x\n MediaSessionManager mediaSessionManager = (MediaSessionManager) getApplicationContext().getSystemService(Context.MEDIA_SESSION_SERVICE);\n if(mediaSessionManager != null) {\n try {\n List<android.media.session.MediaController> mediaControllerList = mediaSessionManager.getActiveSessions\n (new ComponentName(getApplicationContext(), NotificationReceiverService.class));\n\n for (android.media.session.MediaController m : mediaControllerList) {\n if ("com.android.server.telecom".equals(m.getPackageName())) {\n m.dispatchMediaButtonEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));\n m.dispatchMediaButtonEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));\n break;\n }\n }\n } catch (Exception e) { /* Do Nothing */ }\n }\n }\n if(Build.VERSION.SDK_INT < 23) { // Prend en charge jusqu\'\xc3\xa0 Android 5.1\n try {\n if(Build.MANUFACTURER.equalsIgnoreCase("HTC")) { // Uniquement pour HTC\n AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);\n if(audioManager!=null && !audioManager.isWiredHeadsetOn()) {\n Intent i = new Intent(Intent.ACTION_HEADSET_PLUG);\n i.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);\n i.putExtra("state", 0);\n i.putExtra("name", "Orasi");\n try {\n sendOrderedBroadcast(i, null);\n } catch (Exception e) { /* Do Nothing */ }\n }\n }\n Runtime.getRuntime().exec("input keyevent " +\n Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));\n } catch (Exception e) {\n // Runtime.exec(String) had an I/O problem, try to fall back\n String enforcedPerm = "android.permission.CALL_PRIVILEGED";\n Intent btnDown = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(\n Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN,\n KeyEvent.KEYCODE_HEADSETHOOK));\n Intent btnUp = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(\n Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP,\n KeyEvent.KEYCODE_HEADSETHOOK));\n\n this.sendOrderedBroadcast(btnDown, enforcedPerm);\n this.sendOrderedBroadcast(btnUp, enforcedPerm);\n }\n }\n }\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n二、权限:
\n\n if(Build.VERSION.SDK_INT >= 26) { // Permission necessaire\n if(checkSelfPermission("android.permission.ANSWER_PHONE_CALLS") != PackageManager.PERMISSION_GRANTED) {\n String szPermissions[] = {"android.permission.ANSWER_PHONE_CALLS"};\n requestPermissions(szPermissions, 0);\n }\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n if(Build.VERSION.SDK_INT >= 23 && bUseScreen ) { // Permission necessaire\n if(checkSelfPermission("android.permission.SYSTEM_ALERT_WINDOW") != PackageManager.PERMISSION_GRANTED) {\n Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);\n startActivity(myIntent);\n }\n if(Build.VERSION.SDK_INT < 26) { // Permission pour Android 6.x et 7.x\n ContentResolver contentResolver = getContentResolver();\n String enabledNotificationListeners = Settings.Secure.getString(contentResolver, "enabled_notification_listeners");\n String packageName = getPackageName();\n if (enabledNotificationListeners == null || !enabledNotificationListeners.contains(packageName)) {\n Intent intent2 = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);\n startActivity(intent2);\n }\n }\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n注意,有Overlay的权限,不能直接接听电话。
\n\n通知接收服务:
\n\npackage mss.micromega.pmignard.orasi;\n\nimport android.annotation.SuppressLint;\nimport android.annotation.TargetApi;\nimport android.os.Build;\nimport android.service.notification.NotificationListenerService;\n\n@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)\n@SuppressLint("OverrideAbstract")\npublic class NotificationReceiverService extends NotificationListenerService {\n public NotificationReceiverService() {\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n显现:
\n\n <service android:name=".NotificationReceiverService"\n android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"\n android:enabled="true"\n android:exported="true" >\n <intent-filter>\n <action android:name="android.service.notification.NotificationListenerService" />\n </intent-filter>\n </service>\n
Run Code Online (Sandbox Code Playgroud)\n\n<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>\n<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n问候。
\n\n已编辑,我没有使用好的帐户
\n 归档时间: |
|
查看次数: |
8036 次 |
最近记录: |