Procédure de programmation pour prendre une capture d'écran sur Android?
Comment puis-je prendre une capture d'écran d'une zone sélectionnée de téléphone à écran pas par n'importe quel programme, mais à partir du code?
- Pas d'émulateur. J'ai besoin de faire une capture d'écran d'une partie de mon programme, et de faire qch avec elle dans le même programme.
- Une autre bonne référence: stackoverflow.com/a/10296881/439171
Vous devez vous connecter pour publier un commentaire.
Voici le code qui a permis à ma capture d'écran afin d'être stockées sur une carte SD et de les utiliser ultérieurement pour quels que soient vos besoins:
Tout d'abord, vous devez ajouter une autorisation appropriée pour enregistrer le fichier:
Et c'est le code (exécution d'une Activité):
Et c'est de cette façon que vous pouvez ouvrir le récemment généré image:
Si vous voulez l'utiliser sur fragment de vue, puis utilisez:
au lieu de
sur takeScreenshot() fonction
Note:
Cette solution ne fonctionne pas si votre boîte de dialogue contient une surface d'affichage. Pour les détails, veuillez consulter la réponse à la question suivante:
Android Prendre une Capture d'écran de la Surface d'Affichage Montre l'Écran Noir
View
depuis, c'est la classe unique de l'API Android qui a lagetRootView()
méthode. Probablement est une vue de l'INTERFACE utilisateur.View v1 = mCurrentUrlMask.getRootView();
j'ai utiliséView v1 = getWindow().getDecorView().getRootView();
et cela fonctionne pour moi.EACCES (Permission denied)
erreur, ajoutez les lignes suivantes à votre AndroidManifest.xml:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Appel de cette méthode, en passant plus à l'extérieur ViewGroup que vous voulez une capture d'écran de:
view
?`getWindow().getDecorView().getRootView()
comme le point de vue des résultats en prenant une capture d'écran de l'application - pas de l'écran.Remarque: ne fonctionne que pour un téléphone enracinée
Par programmation, vous pouvez exécuter
adb shell /system/bin/screencap -p /sdcard/img.png
comme ci-dessouspuis lire
img.png
commeBitmap
et l'utiliser comme votre désir.System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
, mon appareil est android 5.0EDIT: aie pitié avec les downvotes. C'était vrai en 2010, lorsque j'ai répondu à la question.
Tous les programmes qui permettent de captures d'écran de travailler uniquement sur les téléphones rootés.
Pas de racine autorisation ou pas grand codage est nécessaire pour cette méthode.
Sur adb shell à l'aide de commande ci-dessous, vous pouvez prendre des capture d'écran.
Cette commande n'a pas besoin d'avoir une racine permission de même que vous pouvez effectuer à partir du code java d'une application android aussi.
Plus sur keyevent code android voir http://developer.android.com/reference/android/view/KeyEvent.html
Ici nous avons utilisé. KEYCODE_SYSRQ sa valeur est de 120 et utilisé pour le Système de Demande /touche d'Impression Écran.
Comme CJBS dit, L'image de sortie sera enregistré dans /sdcard/Images/Captures d'écran
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
est ok!!Mualig réponse est très bonne, mais j'ai eu le même problème Ewoks décrit, je n'obtiens pas le fond. Alors, parfois, est assez bon et j'ai parfois du texte noir sur fond noir (selon le thème).
Cette solution est fortement basé dans Mualig code et le code que j'ai trouvé dans Robotium. Je suis en rejetant l'utilisation de dessin cache en appelant directement à la méthode de tirage. Avant cela, je vais essayer d'obtenir l'arrière-plan dessiné à partir de l'activité actuelle de tirer en premier.
Ajouter l'autorisation dans le manifeste
Pour Soutenir Guimauve ou versions ci-dessus, veuillez ajouter le code ci-dessous dans l'activité de la méthode onCreate
Comme une référence, un moyen de capturer l'écran (et pas seulement votre activité app) est de capturer le framebuffer (périphérique /dev/graphiques/fb0). Pour ce faire vous devez soit être root, soit votre application doit être d'une application avec la signature des autorisations ("Une autorisation que le système de subventions uniquement si la demande est signée avec le même certificat que l'application qui a déclaré que l'autorisation") - ce qui est très peu probable, sauf si vous avez compilé votre propre ROM.
Chaque framebuffer de capture, à partir d'un couple d'appareils que j'ai testé, contenues exactement une capture d'écran. Les gens ont rapporté qu'elle contient de plus, je suppose que ça dépend de l'image/taille de l'écran.
J'ai essayé de lire le framebuffer en continu, mais il semble de retour pour un montant fixe d'octets lus. Dans mon cas, qui est (3 410 432) octets, ce qui est suffisant pour stocker une trame d'affichage de 854*480 RGBA (3 279 360 octets). Oui, le cadre, en binaire, en sortie de fb0 est RGBA dans mon appareil. Cela dépendra très probablement à partir d'un périphérique à l'autre. Ce sera important pour vous de le décoder =)
Dans mon appareil /dev/graphiques/fb0 autorisations, de sorte que seul root et les utilisateurs dans le groupe graphiques peuvent lire le fb0.
graphiques est un groupe restreint de sorte que vous aurez probablement seulement l'accès fb0 avec un téléphone enracinée utilisant la commande su.
Applications Android ont la id utilisateur (uid) = app_## et id de groupe (guid) = app_## .
adb shell a uid = shell et guid = shell, qui a beaucoup plus d'autorisations que d'une application. Vous pouvez effectivement vérifier les autorisations à /system/permissions/platform.xml
Cela signifie que vous serez en mesure de lire fb0 dans la commande adb shell sans racine, mais vous n'aurez pas le lire dans l'application sans racine.
Donnant READ_FRAME_BUFFER et/ou autorisations sur ACCESS_SURFACE_FLINGER AndroidManifest.xml rien ne sera fait pour une application régulière, car elles ne fonctionnent que pour le 'signature' applications.
Également vérifier ce thread fermé pour plus de détails.
Ma solution est la suivante:
et
Les Images sont enregistrées dans le stockage externe dossier.
view
vous êtes de passage àImageUtils.loadBitmapFromView(this, view)
?Vous pouvez essayer de la bibliothèque suivante:
http://code.google.com/p/android-screenshot-library/
Android Capture d'écran de la Bibliothèque (ASL) permet par programmation des captures d'écran à partir d'appareils Android sans condition d'avoir les privilèges d'accès root. Au lieu de cela, l'ASL utilise un natif de service en cours d'exécution en arrière-plan, lancé via l'Android Debug Bridge (ADB) une fois par périphérique de démarrage.
AJOUTER LA PERMISSION
Basé sur la réponse de @JustinMorris ci-dessus et @NiravDangi ici https://stackoverflow.com/a/8504958/2232148 nous devons prendre l'arrière-plan et de premier plan de la vue et de les assembler comme ceci:
La qualité des paramètres prend une constante de Bitmap.Config, généralement soit
Bitmap.Config.RGB_565
ouBitmap.Config.ARGB_8888
.Vous pouvez essayer de faire quelque chose comme cela,
L'obtention d'un cache bitmap à partir d'un modèle ou d'un point de vue en faisant quelque chose comme
D'abord tu dois
setDrawingCacheEnabled
à une mise en page(un linearlayout ou relativelayout, ou d'une vue)puis
Ensuite, vous faites ce que vous voulez avec le bitmap. Soit en le transformant en un fichier image, ou d'envoyer l'image de l'uri d'ailleurs.
Pour ceux qui veulent capturer un GLSurfaceView, le getDrawingCache ou un dessin sur la toile méthode ne fonctionnera pas.
Vous avez à lire le contenu de l'OpenGL framebuffer après l'image a été rendue. Il y a une bonne réponse ici
Court chemin est
J'ai créé un simple bibliothèque qui prend une capture d'écran d'un
View
et soit vous donne un objet Bitmap ou l'enregistre directement à n'importe quel chemin vous voulezhttps://github.com/abdallahalaraby/Blink
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
Comment obtenir le point de vue de l'activité en cours. Je ne veux pas utiliser l'id de l'xml.takeScreenshotForScreen()
à la place.Si vous voulez prendre une capture d'écran de
fragment
que de suivre ce:Remplacer
onCreateView()
:Logique pour une prise de capture d'écran:
méthode
shareScreenShotM)()
:méthode takeScreenShot():
méthode savePic():
Pour les activités que vous pouvez simplement utiliser
View v1 = getWindow().getDecorView().getRootView();
au lieu demView
Juste s'étendant taraloca de réponse. Vous devez ajouter les lignes suivantes pour le faire fonctionner. J'ai fait le nom de l'image statique. Veuillez vous assurer d'utiliser taraloca horodatage de l'variable au cas où vous avez besoin d'dynamique nom de l'image.
Et dans le AndroidManifest.xml fichier de données suivantes sont doit:
L'affichage de paramètre est la racine de l'objet de mise en page.
La plupart des réponses à cette question, le
Canvas
méthode de dessin ou dessin cache méthode. Cependant, laAfficher.setDrawingCache()
méthode est dépréciée de l'API de 28. Actuellement recommandé à l'API pour faire des captures d'écran est lePixelCopy
classe disponible à partir de l'API 24 (mais les méthodes qui acceptentWindow
paramètre sont disponibles à partir de l'API 26 == Android 8.0 Oreo). Voici un exemple de Kotlin code pour récupérer uneBitmap
:Pour les applications du système seulement!
Remarque: le Système, les applications n'ont pas besoin du "su" pour exécuter cette commande.
Prendre une capture d'écran d'une vue sur android.
Pour Plein De Défilement Des Pages De Capture D'Écran
Si vous voulez capturer une Vue en plein écran capture d'écran (Qui contient une scrollview ou presque) alors consultez cette bibliothèque
Tout ce que vous avez à faire est d'importer les Gradel, et créer un objet de BigScreenshot
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Un rappel sera reçu à l'image des Captures d'écran prises alors automatiquement défiler la vue de l'écran et à la fin, assemblés ensemble.
@Override public void getScreenshot(Bitmap bitmap) {}
Qui peuvent être enregistrées à la galerie ou que ce soit l'utilisation est nécessaire de leur après
si vous voulez capturer un point de vue ou de mise en page comme RelativeLayout ou LinearLayout etc.
utilisez simplement le code :
maintenant, vous pouvez enregistrer cette image sur le périphérique de stockage :