Como posso capturar uma captura de tela de uma área selecionada da tela do telefone, não por nenhum programa, mas pelo código?
android
screenshot
korovaisdead
fonte
fonte
Respostas:
Aqui está o código que permite que minha captura de tela seja armazenada em um cartão SD e usada posteriormente para quaisquer que sejam suas necessidades:
Primeiro, você precisa adicionar uma permissão adequada para salvar o arquivo:
E este é o código (executando em uma atividade):
E é assim que você pode abrir a imagem gerada recentemente:
Se você deseja usar isso na exibição de fragmentos, use:
ao invés de
na função takeScreenshot ()
Nota :
Esta solução não funciona se o seu diálogo contiver uma visualização de superfície. Para mais detalhes, verifique a resposta à seguinte pergunta:
Android Captura de tela da exibição em superfície mostra a tela preta
fonte
mCurrentUrlMask
deve ser umaView
vez que é a classe exclusiva na API do Android que possui ogetRootView()
método Provavelmente é uma visão na interface do usuário.View v1 = mCurrentUrlMask.getRootView();
eu useiView v1 = getWindow().getDecorView().getRootView();
e funciona para mim.Chame esse método, passando o ViewGroup mais externo do qual você deseja uma captura de tela:
fonte
view
? `#getWindow().getDecorView().getRootView()
como a visualização resulta em uma captura de tela apenas do aplicativo - não da tela.Nota: funciona apenas para telefone enraizado
Programaticamente, você pode executar
adb shell /system/bin/screencap -p /sdcard/img.png
como abaixoentão leia
img.png
comoBitmap
e use como desejar.fonte
System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
, meu dispositivo é o Android 5.0EDIT: tenha piedade dos votos negativos. Era verdade em 2010, quando eu respondi a pergunta.
Todos os programas que permitem capturas de tela funcionam apenas em telefones com root.
fonte
Nenhuma permissão de raiz ou grande codificação é necessária para este método.
No shell adb, usando o comando abaixo, você pode capturar a tela.
Este comando não requer permissão de root, assim você também pode executar o código java do aplicativo Android.
Mais sobre o código do evento principal no Android, consulte http://developer.android.com/reference/android/view/KeyEvent.html
Aqui nós usamos. KEYCODE_SYSRQ seu valor é 120 e é usado para a chave Solicitação do sistema / Tela de impressão.
Como disse o CJBS, a imagem de saída será salva em / sdcard / Pictures / Screenshots
fonte
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
está bem !!A resposta de Mualig é muito boa, mas eu tive o mesmo problema que Ewoks descreve, não estou entendendo nada. Às vezes, é bom o suficiente e às vezes recebo texto em preto sobre fundo preto (dependendo do tema).
Esta solução é fortemente baseada no código Mualig e no código que encontrei no Robotium. Estou descartando o uso do cache de desenho chamando diretamente para o método draw. Antes disso, tentarei extrair o plano de fundo da atividade atual para desenhá-lo primeiro.
fonte
Adicione a permissão no manifesto
Para suportar versões do Marshmallow ou superior, adicione o código abaixo na atividade onCreate method
fonte
Como referência, uma maneira de capturar a tela (e não apenas a atividade do seu aplicativo) é capturar o buffer de quadros (dispositivo / dev / graphics / fb0). Para fazer isso, você deve ter privilégios de root ou seu aplicativo deve ser um aplicativo com permissões de assinatura ("Uma permissão que o sistema concede somente se o aplicativo solicitante for assinado com o mesmo certificado que o aplicativo que declarou a permissão") - que é muito improvável, a menos que você tenha compilado sua própria ROM.
Cada captura de buffer de quadros, de alguns dispositivos que testei, continha exatamente uma captura de tela. As pessoas relataram que ele contém mais, acho que depende do tamanho do quadro / tela.
Tentei ler o framebuffer continuamente, mas parece retornar uma quantidade fixa de bytes lidos. No meu caso, são (3 410 432) bytes, o suficiente para armazenar um quadro de exibição de 854 * 480 RGBA (3 279 360 bytes). Sim, o quadro, em binário, emitido a partir de fb0 é RGBA no meu dispositivo. Provavelmente, isso dependerá de dispositivo para dispositivo. Isso será importante para você decodificá-lo =)
No meu dispositivo / dev / graphics / fb0, as permissões são para que apenas o usuário root e os usuários dos gráficos do grupo possam ler o fb0.
graphics é um grupo restrito, portanto, você provavelmente só acessará o fb0 com um telefone root usando o comando su.
Os aplicativos Android têm o ID do usuário (uid) = app _ ## e o ID do grupo (guid) = app _ ## .
O shell adb possui uid = shell e guid = shell , que tem muito mais permissões que um aplicativo. Você pode realmente verificar essas permissões em /system/permissions/platform.xml
Isso significa que você poderá ler fb0 no shell adb sem raiz, mas não o lerá dentro do aplicativo sem raiz.
Além disso, conceder permissões READ_FRAME_BUFFER e / ou ACCESS_SURFACE_FLINGER no AndroidManifest.xml não fará nada para um aplicativo comum, porque elas só funcionarão para aplicativos de ' assinatura '.
Verifique também este tópico fechado para obter mais detalhes.
fonte
Minha solução é:
e
As imagens são salvas na pasta de armazenamento externo.
fonte
view
você está passandoImageUtils.loadBitmapFromView(this, view)
?Você pode tentar a seguinte biblioteca: http://code.google.com/p/android-screenshot-library/ A Biblioteca de capturas de tela do Android (ASL) permite capturar programaticamente capturas de tela de dispositivos Android sem a necessidade de ter privilégios de acesso root. Em vez disso, o ASL utiliza um serviço nativo em execução em segundo plano, iniciado pelo Android Debug Bridge (ADB) uma vez por inicialização do dispositivo.
fonte
Com base na resposta de @JustinMorris acima e @NiravDangi aqui https://stackoverflow.com/a/8504958/2232148 , devemos pegar o plano de fundo e o primeiro plano de uma visualização e montá-los da seguinte forma:
O parâmetro quality recebe uma constante de Bitmap.Config, normalmente
Bitmap.Config.RGB_565
ouBitmap.Config.ARGB_8888
.fonte
ADICIONAR PERMISSÃO
fonte
Você pode tentar fazer algo assim,
Obtendo um cache de bitmap a partir de um layout ou exibição, fazendo algo como Primeiro, você precisa
setDrawingCacheEnabled
de um layout (um layout linear ou layout relativo ou uma exibição)então
Então você faz o que quiser com o bitmap. Transforme-o em um arquivo de imagem ou envie a interface do usuário do bitmap para outro lugar.
fonte
Para aqueles que desejam capturar um GLSurfaceView, o método getDrawingCache ou desenho para tela não funciona.
Você deve ler o conteúdo do buffer de estrutura OpenGL após a renderização do quadro. Há uma boa resposta aqui
fonte
Eu criei uma biblioteca simples que tira uma captura de tela de
View
e fornece um objeto Bitmap ou salva diretamente em qualquer caminho que você desejarhttps://github.com/abdallahalaraby/Blink
fonte
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
Como obter uma visão da atividade atual. Eu não quero usar o ID do xml.takeScreenshotForScreen()
vez disso.Caminho curto é
fonte
Apenas estendendo a resposta da taraloca. Você deve adicionar as seguintes linhas para fazê-lo funcionar. Eu fiz o nome da imagem estático. Certifique-se de usar a variável timestamp do taraloca, caso precise de um nome de imagem dinâmico.
E no arquivo AndroidManifest.xml, as seguintes entradas são obrigatórias:
fonte
Se você quiser tirar uma captura de tela,
fragment
siga este procedimento:Substituir
onCreateView()
:Lógica para captura de tela:
método
shareScreenShotM)()
:método takeScreenShot ():
método savePic ():
Para atividade, você pode simplesmente usar em
View v1 = getWindow().getDecorView().getRootView();
vez demView
fonte
A maioria das respostas para esta pergunta usa o
Canvas
método de desenho ou o cache de desenho. No entanto, oView.setDrawingCache()
método está obsoleto na API 28 . Atualmente, a API recomendada para fazer capturas de tela é aPixelCopy
classe disponível na API 24 (mas os métodos que aceitamWindow
parâmetro estão disponíveis na API 26 == Android 8.0 Oreo). Aqui está um exemplo de código Kotlin para recuperar umBitmap
:fonte
Apenas para aplicativos do sistema!
Nota: Os aplicativos do sistema não precisam executar "su" para executar este comando.
fonte
A visualização de parâmetro é o objeto de layout raiz.
fonte
Para captura de tela de rolagem de página inteira
Se você deseja capturar uma captura de tela completa do View (que contém uma visualização de rolagem ou mais), verifique esta biblioteca
Tudo o que você precisa fazer é importar o Gradel e criar um objeto do BigScreenshot
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Um retorno de chamada será recebido com o bitmap das capturas de tela capturadas enquanto rolando automaticamente pelo grupo de exibição de tela e, no final, reunidos.
@Override public void getScreenshot(Bitmap bitmap) {}
Os quais podem ser salvos na galeria ou qualquer uso que seja necessário, após
fonte
Tire uma captura de tela de uma visualização no Android.
fonte
se você deseja capturar uma visualização ou layout como RelativeLayout ou LinearLayout etc., basta usar o código:
agora você pode salvar este bitmap no armazenamento do dispositivo:
fonte