0

プログラムでAndroidデバイスの画面全体のスクリーンショットを撮ることができるアプリケーションを作りたいです。

私はいくつかの研究開発を行いましたが、ルート化されたデバイスのみ、またはAPIレベル4.0がこれを達成するためのアクセスを許可するより高いデバイスでスクリーンショットを撮る唯一の方法があることを示唆しています.

ルート化されていないデバイスでもスクリーンショットを撮ることができる有料アプリケーションがすでにいくつかあります。

したがって、root化されていないデバイスでそれを行う方法を誰かが私に提案してくれれば、それは素晴らしいことです.

前もって感謝します。

4

3 に答える 3

1

私は最近、ソーシャル メディアとの共有に使用するのと同様のことを行いました。私のスクリーンショットをSDカードに保存し、後で必要に応じて使用できるようにするコードは次のとおりです。

// image naming and path  to include sd card  appending name you choose for file
String mPath = Environment.getExternalStorageDirectory().toString() + "/" + Image;   

// create bitmap screen capture
Bitmap bitmap;
View v1 = mCurrentUrlMask.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);

OutputStream fout = null;
imageFile = new File(mPath);

try {
    fout = new FileOutputStream(imageFile);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
    fout.flush();
    fout.close();

} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

次に、アクセスする必要がある場合は、次のようなものを使用します。

Uri uri = Uri.fromFile(new File(mPath));
于 2013-10-25T12:14:59.317 に答える
0

SDK を使用すると、ルート ビュー (およびそのすべての子ビュー) のスクリーンショットのみを取得できます。これは、ビューのみを意味します。ダイアログ、トースト、キーボード、スピナー、ステータス バーは同じビュー ツリーを共有しないため、取得されません。

Playストアにはいくつかのアプリがありますが、それらはクロスプラットフォームではありません. ルート化されたデバイスを使用すると、ASL (Android スクリーンショット ライブラリ) を使用して、/dev/graphics/fb0 フレームバッファー経由でスクリーンショットを取得できます。これはうまく機能し、ddms に似たグラブを生成します。ビデオ ハードウェア オーバーレイは黒のままになります。

あなたが言及したこれらのアプリをリバースエンジニアリングしたことはありませんが、使用しているデバイスを認識し、スクリーンショットを撮るキーを送信し(ボリューム+ダウンなど)、SDカード上の新しいファイルを監視すると信じています. スクリーンショットを取得するのに時間がかかることがわかります。

TestFairy ( http://www.testfairy.com ) は、opengl サーフェス ビュー、トースト、ダイアログなど、アプリの画面全体を取得します。これはインストルメンテーションを介して行われ、自動的に行われます。

これが役立つことを願っています:)

于 2013-10-25T22:12:37.393 に答える
-1

これを試して

public void shareit()
    {
        View view =  findViewById(R.id.layout);//ur layout id
        view.getRootView();
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) 
        {
            picDir  = new File(Environment.getExternalStorageDirectory()+ "/myPic");
            if (!picDir.exists())
            {
                picDir.mkdir();
            }
            view.setDrawingCacheEnabled(true);
            view.buildDrawingCache(true);
            Bitmap bitmap = view.getDrawingCache();
//          Date date = new Date();
            String fileName = "mylove" + ".jpg";
            picFile = new File(picDir + "/" + fileName);
            try 
            {
                picFile.createNewFile();
                FileOutputStream picOut = new FileOutputStream(picFile);
                bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2));
                boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut);
                if (saved) 
                {
                    Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show();
                } else 
                {
                    //Error
                }
                picOut.close();
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
            view.destroyDrawingCache();
        } else {
            //Error

        }

    }
于 2013-12-24T07:14:29.857 に答える