Nabend Leute, ich bin es schon wieder
Habe diesmal das Problem dass ich aus meiner APP eine andere APP aufrufe, welche mir als Result ein Bild zurückgeben soll, welches ich dann auf meine SD Karte in den privaten Bereich meiner APP speichern will.
1. ich erstelle eine Liste aller möglichen Apps die ein Bild zurückgeben können
2. Beim Anklicken einer der Apps wird diese gestartet und mit dem Code 55 versehen.
Habe hierfür als Test immer erst mal die Gallery benutzt.
3. Nachdem das Bild ausgewählt wurde, komme ich in die Methode onActivityResult wo die Funktion aufgerufen wird, mit der auf der SD Card ein File anlegt wird, in welches ich die ausgewählte Datei gespeichert werden soll.
Bis hier hin funktioniert noch alles ohne Probleme.
An der Stelle
Uri outputFileUri = Uri.fromFile(photoFile);
data.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
wo die zurückgegebene Datei dann per putExtra in das File geschrieben werden soll, passiert dann aber gar nichts.
Die Datei existiert auf der SD Card im entsprechendem Verzeichnis ist jedoch 0 kb groß -also leer.
Habe auch schon debuggt:
outputFileUri
file:///storage/sdcard/Android/data/de.hotti.myapp/files/JPEG_19691231_190000_656819955.jpg
data
Intent { dat=content://media/external/images/media/78 (has extras) }
Hat irgendwer einen Ratschlag. Ich habs mir auch echt nicht einfach gemacht, hab schon dutzende Code Snipets probiert und wirklich viel gelesen, aber irgendwie komme ich den entscheidenen Schritt einfach nicht weiter....
Hier meine Permissions:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
Hier mein Code dazu:
onActivityResult
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 55)
{
if (resultCode == RESULT_OK && data != null)
{
File photoFile = null;
try
{
photoFile = ImagePickUpUtil.createImageFile(this);
if (photoFile != null)
{
Uri outputFileUri = Uri.fromFile(photoFile);
data.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
}
}
catch (IOException ex)
{
}
}
}
}
Alles anzeigen
Klasse ImagePickUpUtil
public class ImagePickUpUtil
{
/** * Detect the available intent and open a new dialog. * @param context */
public static void openMediaSelector(Activity context)
{
Intent camIntent = new Intent("android.media.action.IMAGE_CAPTURE");
Intent gallIntent = new Intent(Intent.ACTION_GET_CONTENT);
gallIntent.setType("image/*"); // look for available intents
List<ResolveInfo> info = new ArrayList<ResolveInfo>();
List<Intent> yourIntentsList = new ArrayList<Intent>();
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> listCam =
packageManager.queryIntentActivities(camIntent, 0);
for (ResolveInfo res : listCam)
{
final Intent finalIntent = new Intent(camIntent);
finalIntent.setComponent(new ComponentName(
res.activityInfo.packageName,
res.activityInfo.name));
yourIntentsList.add(finalIntent);
info.add(res);
}
List<ResolveInfo> listGall =
packageManager.queryIntentActivities(gallIntent, 0);
for (ResolveInfo res : listGall)
{
final Intent finalIntent = new Intent(gallIntent);
finalIntent.setComponent(new ComponentName(
res.activityInfo.packageName,
res.activityInfo.name));
yourIntentsList.add(finalIntent);
info.add(res);
} // show available intents
openDialog(context, yourIntentsList, info);
}
private static void openDialog(
final Activity context,
final List<Intent> intents,
List<ResolveInfo> activitiesInfo)
{
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle("select an action");
dialog.setAdapter(
buildAdapter(context, activitiesInfo),
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int id)
{
Intent intent = intents.get(id);
context.startActivityForResult(intent, 55);
}
});
dialog.setNeutralButton(
"cancel",
new android.content.DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
dialog.show();
}
/** * Build the list of items to show using the intent_listview_row layout. * @param context * @param activitiesInfo * @return */
private static ArrayAdapter<ResolveInfo> buildAdapter(
final Context context,
final List<ResolveInfo> activitiesInfo)
{
return new ArrayAdapter<ResolveInfo>(
context,
R.layout._list_row,
R.id.title,
activitiesInfo)
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = super.getView(position, convertView, parent);
ResolveInfo res = activitiesInfo.get(position);
ImageView image = (ImageView) view.findViewById(R.id.list_image);
image.setImageDrawable(res.loadIcon(context.getPackageManager()));
TextView textview = (TextView) view.findViewById(R.id.title);
textview.setText(res.loadLabel(context.getPackageManager()).toString());
return view;
}
};
}
static String mCurrentPhotoPath;
public static File createImageFile(Context context) throws IOException
{
// Create an image file name
String timeStamp =
new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date(0));
String imageFileName = "JPEG_" + timeStamp + "_";
String sState = Environment.getExternalStorageState();
File storageDir = context.getExternalFilesDir(null);
File sState2 = context.getFilesDir();
File image = null;
try
{
image = File.createTempFile(imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
}
catch (IOException e)
{
e.printStackTrace();
}
return image;
}
Alles anzeigen