Comment puis-je faire une capture d'écran d'une zone sélectionnée de l'écran du téléphone non pas par un programme mais à partir du code?
android
screenshot
korovaisdead
la source
la source
Réponses:
Voici le code qui a permis à ma capture d'écran d'être stockée sur une carte SD et utilisée plus tard pour tous vos besoins:
Tout d'abord, vous devez ajouter une autorisation appropriée pour enregistrer le fichier:
Et voici le code (en cours d'exécution dans une activité):
Et voici comment ouvrir l'image récemment générée:
Si vous souhaitez l'utiliser sur la vue fragmentaire, utilisez:
au lieu de
sur takeScreenshot () fonction
Remarque :
Cette solution ne fonctionne pas si votre boîte de dialogue contient une vue de surface. Pour plus de détails, veuillez vérifier la réponse à la question suivante:
Android Prendre une capture d'écran de Surface View montre un écran noir
la source
mCurrentUrlMask
doit être unView
puisque c'est la classe unique dans l'API Android qui a lagetRootView()
méthode. Est probablement une vue dans l'interface utilisateur.View v1 = mCurrentUrlMask.getRootView();
j'ai utiliséView v1 = getWindow().getDecorView().getRootView();
et cela fonctionne pour moi.Appelez cette méthode, en passant le groupe de vues externe le plus éloigné dont vous souhaitez une capture d'écran:
la source
view
? ''getWindow().getDecorView().getRootView()
la vue, vous prenez une capture d'écran de l'application et non de l'écran.Remarque: fonctionne uniquement pour les téléphones rootés
Par programme, vous pouvez exécuter
adb shell /system/bin/screencap -p /sdcard/img.png
comme ci-dessouspuis lire
img.png
commeBitmap
et utiliser comme souhait.la source
System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
, mon appareil est Android 5.0EDIT: ayez pitié des downvotes. C'était vrai en 2010 lorsque j'ai répondu à la question.
Tous les programmes qui permettent les captures d'écran ne fonctionnent que sur les téléphones rootés.
la source
Aucune autorisation root ou aucun grand codage n'est requis pour cette méthode.
Sur adb shell en utilisant la commande ci-dessous, vous pouvez prendre une capture d'écran.
Cette commande ne nécessite aucune autorisation root, donc vous pouvez également effectuer à partir du code java de l'application Android.
Pour en savoir plus sur le code d'événement clé dans Android, voir http://developer.android.com/reference/android/view/KeyEvent.html
Ici, nous avons utilisé. KEYCODE_SYSRQ sa valeur est 120 et utilisée pour la clé d'écran de demande / d'impression du système.
Comme l'a dit CJBS, l'image de sortie sera enregistrée dans / sdcard / Pictures / Screenshots
la source
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
est ok !!La réponse de Mualig est très bonne, mais j'ai eu le même problème que décrit Ewoks, je ne comprends pas l'arrière-plan. Donc, parfois c'est assez bien et parfois je reçois du texte noir sur fond noir (selon le thème).
Cette solution est fortement basée sur le code Mualig et le code que j'ai trouvé dans Robotium. J'écarte l'utilisation du cache de dessin en appelant directement la méthode draw. Avant cela, j'essaierai de tirer l'arrière-plan de l'activité en cours pour le dessiner en premier.
la source
Ajoutez l'autorisation dans le manifeste
Pour prendre en charge Marshmallow ou les versions ci-dessus, veuillez ajouter le code ci-dessous dans la méthode d'activité onCreate
la source
À titre de référence, une façon de capturer l'écran (et pas seulement l'activité de votre application) est de capturer le framebuffer (device / dev / graphics / fb0). Pour ce faire, vous devez disposer des privilèges root ou votre application doit être une application avec des autorisations de signature ("Une autorisation que le système n'accorde que si l'application demandeuse est signée avec le même certificat que l'application qui a déclaré l'autorisation") - qui est très peu probable, sauf si vous avez compilé votre propre ROM.
Chaque capture de framebuffer, à partir de quelques appareils que j'ai testés, contenait exactement une capture d'écran. Les gens ont signalé qu'il contenait plus, je suppose que cela dépend de la taille du cadre / de l'affichage.
J'ai essayé de lire le framebuffer en continu, mais il semble revenir pour une quantité fixe d'octets lus. Dans mon cas, cela fait (3 410 432) octets, ce qui est suffisant pour stocker un cadre d'affichage de 854 * 480 RGBA (3 279 360 octets). Oui, le cadre, en binaire, sorti de fb0 est RGBA dans mon appareil. Cela dépendra très probablement d'un appareil à l'autre. Ce sera important pour vous de le décoder =)
Dans mon appareil / dev / graphics / fb0, les autorisations sont telles que seuls les utilisateurs root et de groupe peuvent lire le fb0.
les graphiques sont un groupe restreint, vous n'accéderez probablement à fb0 qu'avec un téléphone rooté en utilisant la commande su.
Les applications Android ont l' ID utilisateur (uid) = app _ ## et l' ID de groupe (guid) = app _ ## .
adb shell a uid = shell et guid = shell , qui a beaucoup plus d'autorisations qu'une application. Vous pouvez réellement vérifier ces autorisations dans /system/permissions/platform.xml
Cela signifie que vous pourrez lire fb0 dans le shell adb sans root mais vous ne le lirez pas dans l'application sans root.
En outre, l'octroi d'autorisations READ_FRAME_BUFFER et / ou ACCESS_SURFACE_FLINGER sur AndroidManifest.xml ne fera rien pour une application standard, car ceux-ci ne fonctionneront que pour les applications « signature ».
Consultez également ce fil fermé pour plus de détails.
la source
Ma solution est:
et
Les images sont enregistrées dans le dossier de stockage externe.
la source
view
tu passesImageUtils.loadBitmapFromView(this, view)
?Vous pouvez essayer la bibliothèque suivante: http://code.google.com/p/android-screenshot-library/ La bibliothèque de captures d'écran Android (ASL) permet de capturer par programme des captures d'écran à partir d'appareils Android sans avoir besoin des privilèges d'accès root. Au lieu de cela, ASL utilise un service natif exécuté en arrière-plan, démarré via le pont de débogage Android (ADB) une fois par démarrage de l'appareil.
la source
Sur la base de la réponse de @JustinMorris ci-dessus et @NiravDangi ici https://stackoverflow.com/a/8504958/2232148, nous devons prendre l'arrière-plan et le premier plan d'une vue et les assembler comme ceci:
Le paramètre de qualité prend une constante de Bitmap.Config, généralement soit
Bitmap.Config.RGB_565
ouBitmap.Config.ARGB_8888
.la source
AJOUTER LA PERMISSION
la source
Vous pouvez essayer de faire quelque chose comme ça,
Obtenir un cache bitmap à partir d'une mise en page ou d'une vue en faisant quelque chose comme Premièrement, vous devez
setDrawingCacheEnabled
accéder à une mise en page (une mise en page linéaire ou relative, ou une vue)puis
Ensuite, vous faites ce que vous voulez avec le bitmap. Soit en le transformant en fichier image, soit en envoyant l'uri du bitmap ailleurs.
la source
Pour ceux qui veulent capturer une GLSurfaceView, la méthode getDrawingCache ou le dessin sur toile ne fonctionnera pas.
Vous devez lire le contenu du framebuffer OpenGL après le rendu du cadre. Il y a une bonne réponse ici
la source
J'ai créé une bibliothèque simple qui prend une capture d'écran d'un
View
et vous donne un objet Bitmap ou l'enregistre directement dans le chemin que vous voulezhttps://github.com/abdallahalaraby/Blink
la source
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
avez mentionné comment obtenir une vue de l'activité actuelle. Je ne veux pas utiliser l'identifiant du xml.takeScreenshotForScreen()
place.Le chemin est court
la source
Je prolonge simplement la réponse de taraloca. Vous devez ajouter des lignes suivantes pour le faire fonctionner. J'ai rendu le nom de l'image statique. Veuillez vous assurer d'utiliser la variable d'horodatage de taraloca au cas où vous auriez besoin d'un nom d'image dynamique.
Et dans le fichier AndroidManifest.xml, les entrées suivantes doivent être:
la source
Si vous souhaitez prendre une capture d'écran à partir
fragment
de ce qui suit:Remplacer
onCreateView()
:Logique pour prendre une capture d'écran:
méthode
shareScreenShotM)()
:méthode takeScreenShot ():
méthode savePic ():
Pour l'activité, vous pouvez simplement utiliser
View v1 = getWindow().getDecorView().getRootView();
au lieu demView
la source
La plupart des réponses à cette question utilisent la
Canvas
méthode de dessin ou la méthode de cache de dessin. Cependant, laView.setDrawingCache()
méthode est déconseillée dans l'API 28 . Actuellement, l'API recommandée pour faire des captures d'écran est laPixelCopy
classe disponible à partir de l'API 24 (mais les méthodes qui acceptent lesWindow
paramètres sont disponibles à partir de l'API 26 == Android 8.0 Oreo). Voici un exemple de code Kotlin pour récupérer unBitmap
:la source
Pour les applications système uniquement!
Remarque: les applications système n'ont pas besoin d'exécuter "su" pour exécuter cette commande.
la source
La vue des paramètres est l'objet de présentation racine.
la source
Pour une capture d'écran de défilement pleine page
Si vous souhaitez capturer une capture d'écran de vue complète (qui contient une vue de défilement), vérifiez cette bibliothèque
Tout ce que vous avez à faire est d'importer le Gradel et de créer un objet de BigScreenshot
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Un rappel sera reçu avec le bitmap des captures d'écran prises tout en faisant défiler automatiquement le groupe de vues d'écran et à la fin assemblées ensemble.
@Override public void getScreenshot(Bitmap bitmap) {}
Qui peut être enregistré dans la galerie ou quelle que soit l'utilisation est nécessaire leur après
la source
Prenez une capture d'écran d'une vue dans Android.
la source
si vous voulez capturer une vue ou une mise en page comme RelativeLayout ou LinearLayout etc. utilisez simplement le code:
vous pouvez maintenant enregistrer ce bitmap sur le stockage de l'appareil en:
la source