Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中本地保存文件(屏幕截图)?_Java_Android_File_Nexus 7 - Fatal编程技术网

如何在Java中本地保存文件(屏幕截图)?

如何在Java中本地保存文件(屏幕截图)?,java,android,file,nexus-7,Java,Android,File,Nexus 7,我的应用程序开发实习即将结束,我被指派从头开始创建一个应用程序,而不是移植苹果版本。我不知道如何保存应用程序内的屏幕截图,然后将其保存到设备。我不想在外部保存,因为你不能假设每个人都使用SD卡 这是我的代码,当我点击send时,我希望生成并保存屏幕截图,以便在使用共享意图时发送屏幕截图 import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.ShareActionProvider; imp

我的应用程序开发实习即将结束,我被指派从头开始创建一个应用程序,而不是移植苹果版本。我不知道如何保存应用程序内的屏幕截图,然后将其保存到设备。我不想在外部保存,因为你不能假设每个人都使用SD卡

这是我的代码,当我点击send时,我希望生成并保存屏幕截图,以便在使用共享意图时发送屏幕截图

import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.ShareActionProvider;
import android.support.v4.view.MenuItemCompat;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.Toast;
import android.text.TextWatcher;
import android.text.Editable;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.content.Intent;
import android.content.Context;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class MainActivity extends ActionBarActivity {
TextView CodexTV;
EditText CodexET;

@Override
public class MainActivity extends ActionBarActivity {
TextView CodexTV;
EditText CodexET;

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

    //Loading our AvianKingdom Codex Font
    Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/WWAvianKingdom-Regular.ttf");
    //Text view label
    CodexET = ((EditText) findViewById(R.id.CodexMessage));
    //REAL-TIME Textview change
    CodexET.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable s) {   //Convert the Text to String
            String inputText = CodexET.getText().toString();
            CodexTV = ((TextView) findViewById(R.id.CustomFontText));
            CodexTV.setText(inputText);
        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // TODO Auto-generated method stub
        }
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
        }
    });

    //Applying the font
    CodexET.setTypeface(tf);

    //Screenshot our Codex'ed Image
    CodexET.setOnKeyListener(new OnKeyListener()
    {
        public boolean onKey(View v, int keyCode, KeyEvent event)
        {
            if (event.getAction() == KeyEvent.ACTION_DOWN)
            {
                switch (keyCode)
                {
                    case KeyEvent.KEYCODE_DPAD_CENTER:
                        doShare(getDefaultIntent());
                        captureScreen();
                    case KeyEvent.KEYCODE_ENTER:
                        doShare(getDefaultIntent());
                        captureScreen();
                    default:
                        break;
                }
            }
            return false;
        }
    });
}

// Basic Share Intent to handle Sharing through Applications.
private Intent getDefaultIntent()
{
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");
    return intent;
}

private ShareActionProvider mShareActionProvider;
以下是当用户点击send时调用的函数:

 //Function for Screenshot and Saving picture.
public Bitmap captureScreen()
{   // Image naming and path.
    String fileName = "DR-Codex.jpg";

    // create bitmap screen capture
    Bitmap bitmap;
    View v1 = CodexET.getRootView();
    v1.setDrawingCacheEnabled(true);
    bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);
    //Start writing to device.
    OutputStream fout = null;
    File imageFile;
    imageFile = new File(getExternalFilesDir(null), fileName);
    try
    {
        //Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
        //intent.setDataAndType(Uri.fromFile(new File(fileName)), "image/*");
        //startActivity(intent);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.JPEG, 90, bos);
        byte[] bitmapdata = bos.toByteArray();

        fout = new FileOutputStream(imageFile);
        fout.write(bitmapdata);
        fout.flush();
        Log.e("File saved yo", "but where");
        fout.close();
    }
    catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        Log.e("File Selector", "The selected file can't be shared: " + fileName);
        e.printStackTrace();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        Log.e("File Selector", "The selected file can't be shared: " + fileName);
        e.printStackTrace();
    }
    finally {
        //Stuff
    }
    return bitmap;
}


private void doShare(Intent shareintent)
{
    mShareActionProvider.setShareIntent(shareintent);
    invalidateOptionsMenu();
}
似乎通过Action.Create_Document intent,我可以创建一个空白文件,但屏幕的图像仍然没有生成

下面是应用程序屏幕的外观。

这是最新的报告列表,我相信我已经强调了这个问题。
有两件事对我来说很突出

1) 将.jpg扩展名添加到文件名中。ie“DR-CODEX.jpg”

2) 不要保存到私有内部getFilesDir,因为这样会由于安全性而导致共享问题。而是保存到getExternalFilesDir(null)

编辑

同样由于getExternalFilesDir,您需要在AndroidManifest.xml中包含以下内容

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

还有可能

   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


这个问题与Android Studio到底有什么关系?这只是一个IDE。请不要在问题上添加不必要的标签。如果应用程序无法在设备上运行,那么开发环境是什么并不重要。如果问题与生成时错误或导出APK等相关,请仅对IDE使用标记。删除标记没有问题。请参阅,文件名生成代码非常混乱,两次合并getCacheDir()的结果,当你根本不应该使用该结果时,因为它指向内部存储上的一个位置,该位置对你的应用程序来说是私有的,不适合共享。我实现了1和2,似乎没有任何变化。另外,从4月28日起,我有代码匹配SA问题的答案“Android中的编程屏幕截图”.我最终能够使用您的答案,它可以工作并保存图片,并覆盖以前的Derator Codex.jpg。