2013-04-09 2 views
4

Я пытался создать приложение, которое появляется в качестве дополнительного источника изображения, когда пользователь пытается обмениваться ими с помощью whatsapp. До сих пор мне удалось получить мое приложение, чтобы показать в сборщике услуг, что whatsapp запускается с использованием фильтров намерений, но я не могу заставить изображение правильно возвращаться к whatsapp. Im разместить свой код ниже:Возврат изображения в whatsapp

public void returnImage(View v){ 
    //Bitmap img; 
    //Bundle selectedImage = new Bundle(); 
    Uri imageURI; 
    Intent shareIntent = new Intent(); 
    switch(v.getId()){ 
    case R.id.eric1 : 
     imageURI = saveToCache(R.drawable.cartman1); 
     shareIntent.putExtra(Intent.EXTRA_STREAM, imageURI); 
     shareIntent.setType("image/png"); 
     setResult(RESULT_OK, shareIntent); 
     Utils.makeToast("Selected",this); 
     System.out.println("--------------------------------"); 
     System.out.println(imageURI.toString()); 
     finish(); 
    } 
} 

    private Uri saveToCache(int resID) { 
    // TODO Auto-generated method stub 
    Bitmap image = BitmapFactory.decodeResource(getResources(), resID); 
    File imageFile; 
    Date d = new Date(); 
    String imgName = ((Long.toString(d.getTime())).subSequence(1, 
      9)).toString(); 
    String state = Environment.getExternalStorageState(); 
    printDebug(state); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     File file = getExternalFilesDir(null); 
     if (file != null) { 
      try { 
       //String root = file.getAbsolutePath(); 
       imageFile = new File(file, imgName+".png"); 
       printDebug(imageFile.getAbsolutePath()); 
       FileOutputStream stream = new FileOutputStream(imageFile); 
       boolean complete = image.compress(Bitmap.CompressFormat.PNG, 100, 
        stream); 
       if (!complete) { 
        Log.d("tag", "image not saved"); 
       } 
       Log.d("tag", "image saved"); 
       // Tell the media scanner about the new file so that it is 
       // immediately available to the user. 
       MediaScannerConnection.scanFile(this, 
         new String[] { imageFile.toString() }, null, 
         new MediaScannerConnection.OnScanCompletedListener() { 
        public void onScanCompleted(String path, Uri uri) { 
         Log.i("ExternalStorage", "Scanned " + path + ":"); 
         Log.i("ExternalStorage", "-> uri=" + uri); 
        } 
       }); 

       return Uri.parse(imageFile.getAbsolutePath()); 
      } catch (IOException e) { 
       Log.d("tag", "Can't save image", e); 
      } 
     } 
    } 
    return null; 
    } 

приложение открывает и я выбрать изображение, но WhatsApp сообщает, что изображение не может быть общим. LogCat не показывает ошибок или предупреждений.

Я прочитал свой ресурс Intent-Filter for Whatsapp -> share image

но нет никакого упоминания о том, как и то, что было возвращено приложение, так что я в полной растерянности здесь.

+1

Может кто-нибудь, пожалуйста, закройте этот вопрос, поскольку никто не отвечает. – Hanut

+0

Такая же проблема здесь –

+1

@JamesCameron: Самое смешное, что я видел приложения на рынке Android, которые на самом деле это делают. Я не знаю, изменили ли они это, или если они спросят у Whatsapp, что приложение ожидает возврата. У меня есть вопрос, хотя, что возвращает галерея изображений (галерея по умолчанию для Android)? Вероятно, это то же самое, что он ожидает? – Hanut

ответ

10

После поиска дней, это рабочее решение для возврата изображений во все другие приложения (проверено на GMail и WhatsApp).

Во-первых, вам нужно установить пристальный фильтр в вашем AndroidManifest.xml (Внутри приложения>деятельности). Это отобразит ваше приложение, когда другие приложения вызывают это намерение (например, при запросе изображения). Примечание: WhatsApp использует action.PICK - намерение. Добавление всех фильтров намерений ниже, хотя и обеспечит отличную совместимость с другими приложениями.

<intent-filter> 
       <action android:name="android.intent.action.PICK" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.OPENABLE" /> 
       <data android:mimeType="image/*" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEND" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.OPENABLE" /> 
       <data android:mimeType="image/*" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.GET_CONTENT" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.OPENABLE" /> 
       <data android:mimeType="image/*" /> 
      </intent-filter> 

Второе, что вам нужно заботиться о откликается на холостом ходу намерения. Это должно состоять из двух частей: сначала вы должны проверить, выполнено ли ваше приложение для возврата изображения или его запуск сам по себе.

Intent intent = getIntent(); 
     if (intent!=null && intent.getType()!=null) //check if any application has executed your app 
     { 
      if(intent.getType().indexOf("image/") != -1) isinint=true; //check if the requested type is an image. If true, set a public static boolean, f.e. named isinint to true. Default is false. 
     } 

Теперь, когда пользователь выбрал изображение, задайте его следующим образом. Из-за проблем с памятью вы должны скопировать файл, который хотите вернуть на SD-карту, и вернуть Uri.

if(isinint) //check if any app cares for the result 
     { 
      Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND, Uri.fromFile(openprev)); //Create a new intent. First parameter means that you want to send the file. The second parameter is the URI pointing to a file on the sd card. (openprev has the datatype File) 

      ((Activity) context).setResult(Activity.RESULT_OK, shareIntent); //set the file/intent as result 
      ((Activity) context).finish(); //close your application and get back to the requesting application like GMail and WhatsApp 
      return; //do not execute code below, not important 
     } 

Примечание!: Вы можете оставить ((Activity) context) при вызове данных в OnCreate или аналогичных void. Поскольку я использую этот фрагмент в другой пустоте, я должен предоставить контекст в любом случае, который должен быть определен как отображаемый.

+0

Отличная работа над ответом: D Хорошая работа. – Hanut

+0

Привет, я .. Я пытаюсь использовать ваше решение, но я не знаю, как получить Uri изображения в моих чертежах. Я пытаюсь Uri path = Uri.parse («android.resource: //com.example.myfragments/drawable/action.png»), но это не работает. Это дает мне нулевой указатель, когда я устанавливаюResult(). Вы можете помочь? –

+0

Google помог бы вам: http://stackoverflow.com/questions/6602417/get-the-uri-of-an-image-stored-in-drawable –

 Смежные вопросы

  • Нет связанных вопросов^_^