2016-06-01 8 views
0

Ich habe eine Anwendung "x", die einen Dienst (in einem anderen Paket) auf Knopfdruck startet. Dieser Dienst sollte jetzt Anrufprotokolle lesen und Daten an die Anwendung "y" senden, die die Daten in die SD-Karte schreiben sollte. Momentan läuft mein Dienst auf Knopfdruck, aber die Anwendung "y" funktioniert nicht, weil ich in der Anwendung "y" anstoße und es kommt nie auf. Die Berechtigungen werden für das Lesen von Protokollen angegeben, und da diese benutzerdefinierte Aktion verwendet wird, ist sie im Absichtsfilter der Anwendung "y" enthalten. Kann jemand den Grund für dieses Problem sagen.Dienst kann die Aktivität anderer App nicht starten

Servicecode

public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.d("TAG", "Service started."); 
     super.onStartCommand(intent, flags, startId); 
     StringBuffer sb = new StringBuffer(); 
     String strOrder = android.provider.CallLog.Calls.DATE + " DESC"; 
    /* Query the CallLog Content Provider */ 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return 0; 
     } 
     Cursor managedCursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null, 
       null, null, strOrder); 
     int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); 
     int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE); 
     int date = managedCursor.getColumnIndex(CallLog.Calls.DATE); 
     int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION); 
     sb.append("Call Log :"); 
     int h = 0; 
     while (managedCursor.moveToNext() && h != 20) { 
      String phNum = managedCursor.getString(number); 
      String callTypeCode = managedCursor.getString(type); 
      String strcallDate = managedCursor.getString(date); 
      Date callDate = new Date(Long.valueOf(strcallDate)); 
      String callDuration = managedCursor.getString(duration); 
      String callType = null; 
      h++; 
      int callcode = Integer.parseInt(callTypeCode); 
      switch (callcode) { 
       case CallLog.Calls.OUTGOING_TYPE: 
        callType = "Outgoing"; 
        break; 
       case CallLog.Calls.INCOMING_TYPE: 
        callType = "Incoming"; 
        break; 
       case CallLog.Calls.MISSED_TYPE: 
        callType = "Missed"; 
        break; 
      } 
      sb.append("\nPhone Number:--- " + phNum + " \nCall Type:--- " 
        + callType + " \nCall Date:--- " + callDate 
        + " \nCall duration in sec :--- " + callDuration); 
      sb.append("\n----------------------------------"); 
     } 
     managedCursor.close(); 
     managedCursor.close(); 
    Intent sendIntent = new Intent(); 
    String CUSTOM_ACTION = "com.example.sonali.callreadingservice.CALL_LOGS"; 
    sendIntent.setAction(CUSTOM_ACTION); 
    sendIntent.putExtra(Intent.EXTRA_TEXT, (Serializable) sb); 
    sendIntent.setType("text/plain"); 
    startActivity(sendIntent); 
    this.stopSelf(); 
    return 0; 
    } 

    @Override 
    public void onDestroy() { 
     Log.d("slog", "onDestroy()"); 
     super.onDestroy(); 
    } 

Anwendung "y" Haupttätigkeit

``public class MainActivity extends AppCompatActivity { 
    TextView textView = null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show(); 
     textView = (TextView) findViewById(R.id.textview_call); 
     Intent intent = getIntent(); 
     String action = intent.getAction(); 
     String type = intent.getType(); 
     handleSendText(intent); 

     } 


    void handleSendText(Intent intent) { 
     String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); 
     try { 
      if (sharedText != null) { 
       textView.setText(sharedText); 
       File sdCard = Environment.getExternalStorageDirectory(); 
       FileWriter writer = new FileWriter(sdCard); 
// Writes the content to the file 
       writer.write(sharedText); 
       writer.flush(); 
       writer.close(); 
      } 
     } catch (Exception e) { 

     } 
    } 

Intent-Filter der Anwendung "y" `

`<intent-filter> 
       <action android:name="com.example.sonali.callreadingservice.CALL_LOGS" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
       <data android:mimeType="text/plain" /> 
      </intent-filter> 
+0

Haben Sie die Aktivität, die Sie ausführen möchten, in der App Y im Manifest des Dienstes definiert? !! –

+0

Wofür benötigen Sie diesen Service? nur um 'Cursor's Daten zu senden? Warum nicht einen 'ContentProvider' verwenden? – pskink

+0

@MuhammedRefaat nein, habe ich nicht. Kannst du mir sagen, wie man es schreibt? –

Antwort

0

Sie benötigen eine benutzerdefinierte Aktion hinzufügen im Manifest zur Aktivität.

<activity 
     android:name="MainActivity"> 
     <intent-filter> 
      <action android:name="com.example.sonali.callreadingservice.CALL_LOGS"/> 
     </intent-filter> 
    </activity> 
+0

Ja habe ich schon getan –

+0

Sie müssen auch eine Standardkategorie für den Intent-Filter hinzufügen.

+0

Es gibt 2 Intent-Filter und in beiden habe ich