我正在尝试找出一种方法来保存InputStream中的数据并在另一个活动中使用它。到目前为止,我已尝试以下面的方式使用sharedPreferences - 但我收到一个错误说明:
"The method putString(String, String) in the type SharedPreferences.Editor is not applicable for the arguments (String, InputStream)"
就行:
editor.putString("fileName", attachment);
如何避免这种情况?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// get the attachment's filename
Intent theIntent = getIntent();
String attachmentFileName = "No file name found";
if (theIntent != null && theIntent.getData() != null) {
Cursor c = getContentResolver().query(theIntent.getData(), null,
null, null, null);
c.moveToFirst();
final int fileNameColumnId = c
.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
if (fileNameColumnId >= 0)
attachmentFileName = c.getString(fileNameColumnId);
try {
InputStream attachment = getContentResolver().openInputStream(
getIntent().getData());
SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("fileName", attachment);
editor.commit();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 0 :(得分:0)
共享首选项是一个XML文件,用于存储小块信息。您正在尝试将附件文件保存到它。这并不是共享优先设计的目的。您应该将文件保存在外部或内部存储上。查看更多here。
至于您的具体错误,putString()
方法的第二个参数是String
。您必须将InputStream
读入一个字节数组,然后将其转换为字符串(基础64?记住附件可以是二进制),这可以保存到共享首选项中。但正如我上面所说,我不相信这是你应该做的。
答案 1 :(得分:0)
您无法将InputStream
存储在SharedPreferences
中,因为只能保存原始数据(int
,boolean
,String
等)办法。
您应该做的是阅读数据,将其保存到String
,然后您可以存储字符串(see here):
BufferedReader reader = new BufferedReader(new InputStreamReader(attachment));
StringBuilder out = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
out.append(line);
}
然后你可以做
editor.putString("fileName", out.toString());
如果确实想要将实际的InputStream
发送到另一个活动(这是奇怪的,但我要判断谁),你可以使用{{1}来做}。
答案 2 :(得分:0)
就像其他人说的那样,共享偏好是不可能的,保持简单:
SharedPreferences.Editor editor = preferences.edit();
editor.putString("fileName", attachmentFileName);
editor.commit();