2015-07-11 40 views
6

Sono nuovo nello sviluppo di Android.Ascolta l'azione dello screenshot su Android

Sto facendo un'applicazione che reagirà quando viene presa la schermata di un telefono Android. Ho sentito che Android permette che tali azioni possano essere rilevate dai ricevitori di trasmissione , quindi ho consultato la documentazione per gli sviluppatori Android, here.

Penso che gli sviluppatori di framework abbiano dimenticato o non implementato un codice di trasmissione di schermate, perché non hanno elencato questa azione nella loro documentazione.

C'è qualche altro modo in cui posso ascoltare lo screenshot intervenendo?

+0

Ehi, avete dei testi d [questa soluzione] (http://stackoverflow.com/a/14951594/518179) usando FileObserver? –

+0

@renam nope .. Lo controllerò e ti informerò presto – droidev

+1

Solo FYI Penso che gli osservatori di file funzioneranno, ma alcune versioni sono buggy con esso come Android 6.0 https://stackoverflow.com/questions/36237314/fileobserver-and- contentobserver-non-lavoro-in-android-marshmallow – Bqin1

risposta

2

È possibile rilevare l'evento preso di ScreenShot utilizzando ContentObserver. Lo sto usando in uno dei miei progetti.

ScreenShotContentObserver.java

public abstract class ScreenShotContentObserver extends ContentObserver { 

    private Context context; 
    private boolean isFromEdit = false; 
    private String previousPath; 

    public ScreenShotContentObserver(Handler handler, Context context) { 
     super(handler); 
     this.context = context; 
    } 

    @Override 
    public boolean deliverSelfNotifications() { 
     return super.deliverSelfNotifications(); 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
    } 

    @Override 
    public void onChange(boolean selfChange, Uri uri) { 
     Cursor cursor = null; 
     try { 
      cursor = context.getContentResolver().query(uri, new String[]{ 
        MediaStore.Images.Media.DISPLAY_NAME, 
        MediaStore.Images.Media.DATA 
      }, null, null, null); 
      if (cursor != null && cursor.moveToLast()) { 
       int displayNameColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME); 
       int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); 
       String fileName = cursor.getString(displayNameColumnIndex); 
       String path = cursor.getString(dataColumnIndex); 
       if (new File(path).lastModified() >= System.currentTimeMillis() - 10000) { 
        if (isScreenshot(path) && !isFromEdit && !(previousPath != null && previousPath.equals(path))) { 
         onScreenShot(path, fileName); 
        } 
        previousPath = path; 
        isFromEdit = false; 
       } else { 
        cursor.close(); 
        return; 
       } 
      } 
     } catch (Throwable t) { 
      isFromEdit = true; 
     } finally { 
      if (cursor != null) { 
       cursor.close(); 
      } 
     } 
     super.onChange(selfChange, uri); 
    } 

    private boolean isScreenshot(String path) { 
     return path != null && path.toLowerCase().contains("screenshot"); 
    } 

    protected abstract void onScreenShot(String path, String fileName); 

} 

E utilizzare questa classe nella vostra attività: -

public class MainActivity extends AppCompatActivity { 

    private ScreenShotContentObserver screenShotContentObserver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     screenShotContentObserver = new ScreenShotContentObserver(handler, this) { 
      @Override 
      protected void onScreenShot(String path, String fileName) { 
       File file = new File(path); //this is the file of screenshot image 
      } 
     }; 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     getContentResolver().registerContentObserver(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       true, 
       screenShotContentObserver 
     ); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     try { 
      getContentResolver().unregisterContentObserver(screenShotContentObserver); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     try { 
      getContentResolver().unregisterContentObserver(screenShotContentObserver); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Non dimenticare di fermare Observer in o onDestroy metodi di un Activity