Я пытаюсь сохранить отредактированное изображение, но получаю ошибку исключения нулевого указателя.вот моя кнопка сохранения OnClick.Изображение, которое я извлекаю, находится внутри drawView и framelayout.
public void save(View v) {
String name = mImageName;
if (name.indexOf(".") > 0) {
name = name.substring(0, name.lastIndexOf(".")) + "_e";
}
MediaStoreSaver.save(mImage2,
mImagePath,
name,
this,
MediaStoreSaver.TYPE_JPG);
Toast.makeText(this, "Saved " + name, Toast.LENGTH_SHORT).show();
А вот мой класс MediaStoreSave.Любая идея, что я сделал не так?
public class MediaStoreSaver {
public static final byte TYPE_PNG = 2;
public static final byte TYPE_JPG = 3;
public static final String save(Bitmap bitmap,
String folderName,
String imageName,
Context mContext,
byte imageType) {
File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
String folder_path = folder.getAbsolutePath();
String file_path = folder_path + "/" + folderName;
File dir = new File(file_path);
if (!dir.exists()) {
dir.mkdirs();
}
File file = null;
try {
String suffix = ".png";
Bitmap.CompressFormat format = Bitmap.CompressFormat.PNG;
if (imageType == TYPE_JPG) {
suffix = ".jpg";
format = Bitmap.CompressFormat.JPEG;
}
file = File.createTempFile(imageName, suffix, dir);
FileOutputStream fOut = new FileOutputStream(file);
bitmap.compress(format, 100, fOut);
System.out.println("saved image: " + file.getAbsolutePath());
fOut.flush();
fOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
MediaStorageScan(mContext, file);
return file.getAbsolutePath();
}
/*
* Refresh image files to view them on computer
*/
private static void MediaStorageScan(Context context, final File file) {
final Uri fileUri = Uri.fromFile(file);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
context.sendBroadcast(new Intent("android.hardware.action.NEW_PICTURE", fileUri));
}
context.sendBroadcast(new Intent("com.android.camera.NEW_PICTURE", fileUri));
final Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(fileUri);
context.sendBroadcast(intent);
}
}
Вот мое сообщение logcat:
2019-02-28 16: 38: 59.512 15830-15830 / rs.example.android.com.healingbrush E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: главнаяПроцесс: rs.example.android.com.healingbrush, PID: 15830java.lang.IllegalStateException: не удалось выполнить метод для Android: onClickна android.view.View $ DeclaredOnClickListener.onClick (View.java:4827)на android.view.View.performClick (View.java:5773)на android.view.View $ PerformClick.run (View.java:23035)на android.os.Handler.handleCallback (Handler.java:836)на android.os.Handler.dispatchMessage (Handler.java:103)на android.os.Looper.loop (Looper.java:232)на android.app.ActivityThread.main (ActivityThread.java:6802)в java.lang.reflect.Method.invoke (родной метод)на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1103)на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:964)
Причина: java.lang.reflect.InvocationTargetExceptionв java.lang.reflect.Method.invoke (родной метод)на android.view.View $ DeclaredOnClickListener.onClick (View.java:4822)на android.view.View.performClick (View.java:5773)на android.view.View $ PerformClick.run (View.java:23035)на android.os.Handler.handleCallback (Handler.java:836)на android.os.Handler.dispatchMessage (Handler.java:103) v на android.os.Looper.loop (Looper.java:232)на android.app.ActivityThread.main (ActivityThread.java:6802)в java.lang.reflect.Method.invoke (родной метод)на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1103)com.android.internal.os.ZygoteInit.main (ZygoteInit.java:964)
Причина: java.lang.NullPointerException: файлна android.net.Uri.fromFile (Uri.java:452)на rs.example.android.com.healingbrush.MediaStoreSaver.MediaStorageScan (MediaStoreSaver.java:77)на rs.example.android.com.healingbrush.MediaStoreSaver.save (MediaStoreSaver.java:69)на rs.example.android.com.healingbrush.MainActivity.save (MainActivity.java:342)в java.lang.reflect.Method.invoke (родной метод)на android.view.View $ DeclaredOnClickListener.onClick (View.java:4822)на android.view.View.performClick (View.java:5773)на android.view.View $ PerformClick.run (View.java:23035)на android.os.Handler.handleCallback (Handler.java:836)на android.os.Handler.dispatchMessage (Handler.java:103)на android.os.Looper.loop (Looper.java:232)на android.app.ActivityThread.main (ActivityThread.java:6802)в java.lang.reflect.Method.invoke (родной метод)на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1103)на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:964)2019-02-28 16: 38: 59,578 1332-1443 /?E / InputDispatcher: канал 'cd07d33 rs.example.android.com.healingbrush / rs.example.android.com.healingbrush.MainActivity (server)' ~ Канал неисправен и будет удален!2019-02-28 16: 39: 01.733 2583-6309 /?E / resmon: [34: StackTraceElement.run] ожидает триггера