Antwort

2

Hier ist mein vollständiger Code, um Benutzer zu benachrichtigen, wenn ein neues Bild, Audio oder Video in das Gerät hinzugefügt wird. Es könnte jemandem helfen. Außerdem zeige ich Push-Benachrichtigungen an, sobald neue Medien hinzugefügt werden.

EDITED (Probleme gelöst sind unten)
1.Notify Benutzer nur dann, wenn Medien hinzugefügt wird, nicht gelöscht.

public class MediaTrackerService extends Service { 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // images 
    getContentResolver().registerContentObserver(
      android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      true, new ContentObserver(new Handler()) { 
       @Override 
       public void onChange(boolean selfChange) { 
        super.onChange(selfChange); 

        Media media = readFromMediaStore(
          getApplicationContext(), 
          MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

        File file = new File(media.file.getPath()); 
        Date fileData = new Date(file.lastModified()); 

        if (System.currentTimeMillis() - fileData.getTime() > 3000) { 

        } else { 

         if (!media.file.getPath().contains("WhatsApp")) { 
          String saved = media.file.getName(); 

          // deduce bitmap before using 
          Bitmap bitmap = BitmapFactory 
            .decodeFile(media.file.getPath()); 

          Intent intent = new Intent(); 
          intent.setDataAndType(Uri.fromFile(media.file), 
            "image/*"); 
          PendingIntent pendingIntent = PendingIntent 
            .getActivity(getApplicationContext(), 
              0, intent, 0); 

          Notification n = new Notification.Builder(
            getApplicationContext()) 
            .setStyle(
              new Notification.BigPictureStyle() 
                .bigPicture(bitmap)) 
            .setContentTitle(
              "New Image File For You") 
            .setContentText("File Name :" + saved) 
            .setSmallIcon(R.drawable.alert_icon_1) 
            .setContentIntent(pendingIntent) 
            .setAutoCancel(true).build(); 

          NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

          notificationManager.notify(0, n); 
         } 
        } 
       } 

       @Override 
       public void onChange(boolean selfChange, Uri uri) { 
        super.onChange(selfChange, uri); 
       } 
      }); 
    // audio 
    getContentResolver().registerContentObserver(
      android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      true, new ContentObserver(new Handler()) { 
       @Override 
       public void onChange(boolean selfChange) { 
        super.onChange(selfChange); 
        Media media = readFromMediaStore(
          getApplicationContext(), 
          MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); 

        File file = new File(media.file.getPath()); 
        Date fileData = new Date(file.lastModified()); 

        if (System.currentTimeMillis() - fileData.getTime() > 3000) { 

        } else { 

         if (!media.file.getPath().contains("WhatsApp")) { 

          String saved = media.file.getName(); 

          Bitmap bitmap = BitmapFactory 
            .decodeFile(media.file.getPath()); 

          Intent intent = new Intent(); 
          intent.setDataAndType(Uri.fromFile(media.file), 
            "audio/*"); 
          PendingIntent pendingIntent = PendingIntent 
            .getActivity(getApplicationContext(), 
              0, intent, 0); 

          Notification n = new Notification.Builder(
            getApplicationContext()) 
            .setStyle(
              new Notification.BigPictureStyle() 
                .bigPicture(null)) 
            .setContentTitle(
              "New audio File For You") 
            .setContentText("File Name :" + saved) 
            .setSmallIcon(R.drawable.alert_icon_1) 
            .setContentIntent(pendingIntent) 
            .setAutoCancel(true).build(); 

          NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

          notificationManager.notify(0, n); 
         } 
        } 
       } 

       @Override 
       public void onChange(boolean selfChange, Uri uri) { 
        super.onChange(selfChange, uri); 
       } 
      }); 
    // video 
    getContentResolver().registerContentObserver(
      android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
      true, new ContentObserver(new Handler()) { 
       @Override 
       public void onChange(boolean selfChange) { 
        super.onChange(selfChange); 
        Media media = readFromMediaStore(
          getApplicationContext(), 
          MediaStore.Video.Media.EXTERNAL_CONTENT_URI); 

        File file = new File(media.file.getPath()); 
        Date fileData = new Date(file.lastModified()); 

        if (System.currentTimeMillis() - fileData.getTime() > 3000) { 

        } else { 
         if (!media.file.getPath().contains("WhatsApp")) { 

          String saved = media.file.getName(); 

          Intent intent = new Intent(); 
          intent.setDataAndType(Uri.fromFile(media.file), 
            "video/*"); 
          PendingIntent pendingIntent = PendingIntent 
            .getActivity(getApplicationContext(), 
              0, intent, 0); 

          Notification n = new Notification.Builder(
            getApplicationContext()) 
            .setStyle(
              new Notification.BigPictureStyle() 
                .bigPicture(null)) 
            .setContentTitle(
              "New Video File For You") 
            .setContentText("File Name :" + saved) 
            .setSmallIcon(R.drawable.alert_icon_1) 
            .setContentIntent(pendingIntent) 
            .setAutoCancel(true).build(); 

          NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

          notificationManager.notify(0, n); 
         } 
        } 
       } 

       @Override 
       public void onChange(boolean selfChange, Uri uri) { 
        super.onChange(selfChange, uri); 
        System.out 
          .println("here is the service change EXTERNAL 1 params" 
            + " " + uri); 
       } 
      }); 
    return START_STICKY; 
} 

private Long readLastDateFromMediaStore(Context context, Uri uri) { 
    Cursor cursor = context.getContentResolver().query(uri, null, null, 
      null, "date_added DESC"); 
    Long dateAdded = (long) -1; 
    if (cursor.moveToNext()) { 
     dateAdded = cursor.getLong(cursor 
       .getColumnIndexOrThrow(MediaColumns.DATE_ADDED)); 
    } 
    cursor.close(); 
    return dateAdded; 
} 

private Media readFromMediaStore(Context context, Uri uri) { 
    Cursor cursor = context.getContentResolver().query(uri, null, null, 
      null, "date_added DESC"); 
    Media media = null; 
    if (cursor.moveToNext()) { 
     int dataColumn = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 
     String filePath = cursor.getString(dataColumn); 
     int mimeTypeColumn = cursor 
       .getColumnIndexOrThrow(MediaColumns.MIME_TYPE); 
     String mimeType = cursor.getString(mimeTypeColumn); 
     media = new Media(new File(filePath), mimeType); 
    } 
    cursor.close(); 
    return media; 
} 

private class Media { 
    private File file; 

    private String type; 

    public Media(File file, String type) { 
     this.file = file; 
     this.type = type; 
    } 

    public String getType() { 
     return type; 
    } 

    public File getFile() { 
     return file; 
    } 
} 

}

und vergessen Sie nicht Ihre Beobachter onDestroy abzumelden().

getContentResolver().unregisterContentObserver(yourObserverObject); 
+0

Vielen Dank das ist perfekt funktioniert. aber was, wenn ich die app kille und ich will auch im hintergrund landen? –

+0

@HarinKaklotar alles oben ist innerhalb einer Service-Klasse 'MediaTrackerService' getan, die nur im Hintergrund läuft. Das Töten der App hat Auswirkungen auf das Ergebnis. –

+0

ja das weiß ich. aber wenn Benutzer die App töten und nach diesem Benutzer eine Musikdatei zum Gerät hinzufügen, so wie kann Benutzer benachrichtigen? und nehmen wir an, dass wir BroadcastReceiver mit Dienst verwenden, was soll ich dann BroadcastReceiver übergeben, um eine neue Audiodatei im Gerät zu erhalten? –

1

Das ist im Allgemeinen nicht möglich. Ihre App hat keine Rechte, das Verhalten anderer Apps auszuspionieren. Wenn der Nutzer über meine App etwas in den App-Teil meiner App internal storage lädt, können Sie nicht auf diesen Content zugreifen (es sei denn, ich möchte ihn zur Verfügung stellen) und Sie können nicht herausfinden, dass der Content hinzugefügt wurde.

Darüber hinaus gibt es vor API Level 24 (Android 7.0) keine anderen Möglichkeiten, dies zu erreichen, als zu versuchen, einen Prozess die ganze Zeit laufen zu lassen. Dies ist nicht gut für den Benutzer hinsichtlich des System-RAM-Verbrauchs und dergleichen. Einige Nutzer sind sehr irritiert, wenn Apps versuchen, die gesamte Zeit über einen Prozess auszuführen, und sie können ihre Irritationen auf kreative Weise in Form von App Store-Bewertungen äußern.

, dass alle gesagt, für öffentlich zugängliche Inhalte (hauptsächlich external storage), wäre die einfachste Lösung, die ein ContentObserver einzurichten, die MediaStoreContentProvider zu überwachen. Unter Android 7.0+ könnten Sie JobScheduler verwenden, um das Gleiche zu tun, mit dem Vorteil, dass Sie Ihren Prozess nicht laufen lassen müssen, um die ContentObserver Beobachtung zu behalten.

+0

danke für ihre erleuchtung. Ich habe die Wunschaufgabe erreicht, indem ich ContentObserver –

+0

Hi wieder benutze, ich habe die gewünschte Aufgabe erreicht und die Antwort auch gepostet, aber ich stelle mich vor, ich möchte nur Benutzer benachrichtigen, wenn Medien hinzugefügt, nicht gelöscht werden. Dieser Codeabschnitt wird in beiden Fällen ausgeführt. –

+0

@bhanukaushik: Es tut uns leid, aber Sie werden für alle Änderungen (Ergänzungen, Änderungen, Umzüge) benachrichtigt werden. Es liegt an Ihnen, irgendwie zu bestimmen, ob einige Medien hinzugefügt wurden. Dies ist einer der Gründe, warum nur wenige Apps versuchen, das zu tun, was Sie tun. – CommonsWare

Verwandte Themen