2016-07-27 13 views
4

Es ist eine spezifische Frage, und ich habe ein bisschen Android-Entwicklung vor, aber nicht so tief in das System-Management.Android-Entwicklung: Haken Verknüpfung auf der Tastatur, wenn Telefon App-Aktivität konzentriert

Also muss ich eine App erstellen, die im Hintergrund läuft (dieser Teil ist OK) und automatisch eine Aktivität der App starten, wenn eine spezielle Abkürzung (sagen wir # 123 * 6) von der Telefon-App-Software-Tastatur eingegeben wird am Telefon.

Können Sie mir bitte angeben, wenn es möglich ist, und wenn ja, welche API/Komponente ich verwenden soll? Kann im Web keine relevanten Informationen finden.

+0

Ich weiß, dass es eine Menge Sicherheit um die Eingabegeräte gibt, aber eine Menge Unsicherheit um die Accessibility-Funktionalität herum, die z. Passwort-Manager verwenden. Weitere Informationen finden Sie unter [Barrierefreiheit für Gebäude] (https://developer.android.com/guide/topics/ui/accessibility/services.html). Dank der Frage, ich bin dabei, es auch zu überprüfen. –

+0

Ich sehe ein View Text Changed-Ereignis auf der Seite ['AccessibilityEvent'] (https://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html), die auf Änderungen in einem' EditText' (nicht Passwortbox tho). Obwohl nicht genau das, wonach Sie gefragt haben, könnte es helfen. Abhängig vom "Warum" könnte der allgemeine Gesten-Listener auch nützlich sein. –

+0

Ich fand diese Themen, die meine Bedürfnisse Jungs erfüllen: http://StackOverflow.com/Questions/11724192/Make-My-App-Launch-When-Secret-Code-entered und http://StackOverflow.com/Questions/9769166/programmatically-enter-secret-code-like-4636-on-android. Es ist mir jedoch nicht gelungen, meinen geheimen Code zu erhalten, um eine Aktivität zu starten. – Alex

Antwort

1

Ok, ich habe endlich das funktioniert auf dem HTC-Gerät. Tatsache ist, Samsung Handys nicht scheint nicht zu geheimen Codes zu reagieren ...

ich einfach haben diese manifest:

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MenuBrowser" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service 
      android:name=".ShortcodeService" 
      android:exported="false"> 
     </service> 

     <receiver 
      android:name=".ShortcodeReceiver" 
      android:enabled="true"> 
      <intent-filter> 
       <action android:name="android.provider.Telephony.SECRET_CODE" /> 
       <data android:scheme="android_secret_code" android:host="1992" /> 
      </intent-filter> 
     </receiver> 
</application> 

Mein Service ist einfach für die richtigen Berechtigungen für Android M Überprüfung (6.0), weil sich die Sicherheit etwas geändert hat. Jetzt müssen wir die Berechtigung während der Laufzeit der Anwendung und nicht bei der Installation während der Installation deklarieren.

Meine Tätigkeit:

public class MenuBrowser extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("USSDBrowser", "Start app"); 

     //if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.PROCESS_OUTGOING_CALLS}, 10); 

     Intent serviceIntent = new Intent(this.getApplicationContext(), ShortcodeService.class); 
     startService(serviceIntent); 

     //setContentView(R.layout.activity_menu_browser); 
     finish(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_menu_browser, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Und mein Empfänger ist wie folgt:

public class ShortcodeReceiver extends BroadcastReceiver { 

    private static String defaultCode = "1992"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Log.d("USSDBrowser", "Intent received"); 

     if(intent.getAction().equals("android.provider.Telephony.SECRET_CODE")) { 
      String code = intent.getDataString(); 

      if(code.equals("android_secret_code://" + defaultCode)) { 
       Log.d("USSDBrowser", "Code received !!! "); 
      } 
      //Intent in = new Intent(context, MenuBrowser.class); 
      //context.startActivity(in); 

      Toast.makeText(context, "You typed a shortcode, hype !", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

Aber jetzt habe ich getestet, dass und es funktioniert für HTC One S (Android 4.1.1) und Aquaris E4 (Android 4.4.2).

Die getesteten Telefone, die keine Geheimcodeabsichten erfassen, sind: Samsung Galaxy S4 und Galaxy S6 (Android 6.0).