Как получить идентификатор / URL-адрес изображения в Picasa из галереи

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

Итак, мой вопрос: как мне получить эту информацию. Мой код намерения вставлен ниже и извлекает URI изображения.

Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_PICK);
startActivityForResult(galleryIntent, GALLERY_PIC_REQUEST);

Я попытался найти PICASA_ID (MediaStore.Images.Media.PICASA_ID), но, используя метод выше, он возвращает значение null. Любые идеи?


person oviroa    schedule 08.08.2011    source источник
comment
Никто? Может ли кто-нибудь дать мне несколько советов о том, как я могу получить PICASA_ID из изображения, отображаемого в галерее в альбомах, отмеченных логотипом Picasa? Это вообще возможно?   -  person oviroa    schedule 09.08.2011
comment
Под picasa вы имеете в виду: picasa.google.com?   -  person Indrek Kõue    schedule 12.08.2011
comment
Не совсем так. В галерее изображений Android по умолчанию отображаются альбомы из Picasa, подключенные к вашей учетной записи Google.   -  person oviroa    schedule 12.08.2011
comment
Единственное найденное мной решение, которое действительно работает и охватывает разные версии Android, эскизы Picasa и локальные файлы: dimitar.me/   -  person Guy    schedule 25.06.2012


Ответы (2)


  • Запустить ACTION_GET_CONTENT намерение вместо ACTION_PICK

  • Предоставьте MediaStore.EXTRA_OUTPUT дополнительную информацию с URI временному файлу.


Добавьте это в свою активность звонков:

File yourFile;

Теперь используйте этот код, чтобы получить намерение:

yourFile = getFileStreamPath("yourTempFile");
yourFile.getParentFile().mkdirs();
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT, null);
galleryIntent .setType("image/*");
galleryIntent .putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(yourFile));
galleryIntent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.name());
startActivityForResult(galleryIntent, GALLERY_PIC_REQUEST);

УБЕДИТЕСЬ, ЧТО yourFile создан

Также в ваших звонках

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode){
    case GALLERY_PIC_REQUEST:
        File file = null;
        Uri imageUri = data.getData();
        if (imageUri == null || imageUri.toString().length() == 0) {
            imageUri = Uri.fromFile(mTempFile);
            file = mTempFile;
            //this is the file you need! Check it
        }
        //if the file did not work we try alternative method
        if (file == null) {
            if (requestCode == 101 && data != null) {
                Uri selectedImageUri = data.getData();
                String selectedImagePath = getPath(selectedImageUri);
                //check this string to extract picasa id
            }
        }
    break;
    }
}

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if(cursor!=null)
    {
        int index = cursor
        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(index);
    }
    else return null;
}
person Sherif elKhatib    schedule 15.08.2011
comment
Хм, я понял первую часть, но это не то, что я пытаюсь сделать. Я не хочу загружать файл с Picasa локально, это требует очень больших затрат полосы пропускания и ресурсов. Мне просто нужен идентификатор Picasa, чтобы я мог прикрепить его к своим данным. Я попробую вторую часть (если file == null), и если это сработает, то у меня есть ответ. Спасибо. - person oviroa; 15.08.2011
comment
Я посмотрел на ответ и, похоже, мой вопрос не понял. Я пытаюсь каким-либо образом избегать загрузки изображения с Picasa. Поэтому локальное сохранение в виде временного файла этого не делает. Я спрашиваю, есть ли способ получить какую-либо информацию об этом изображении (идентификатор, URL-адрес Picasa и т. Д.) Из встроенной галереи / альбома. - person oviroa; 15.08.2011
comment
Кроме того, вышеприведенное решение не работает, не на моем N1. Изображение не может быть сохранено на карте, я обнаружил ошибки и нулевой путь: 08-15 18: 35: 03.747: ERROR / (11427): Not JPEG: /mnt/sdcard/DCIM/Camera/1313433294232.jpg 08-15 18 : 35: 03.797: ОШИБКА / (11427): Не JPEG: /mnt/sdcard/DCIM/Camera/1313433294232.jpg 08-15 18: 35: 03.847: ОШИБКА / PicasaAPI (11427): getAlbums: неожиданный код состояния 403 данные: java.util.zip.GZIPInputStream@40554d48. Во-вторых, если я просто выполняю часть file == null, я получаю путь, содержащий длинный номер, который является специальным UID, но не связан с какой-либо идентификацией picasa. - person oviroa; 15.08.2011
comment
здесь не было: попробуйте log.v (, imageUri) .. посмотрите, какие там данные! - person Sherif elKhatib; 16.08.2011
comment
Вот что я получаю: 08-16 00: 33: 28.033: ERROR / CropImage (12825): Невозможно сохранить в файл uri: ///data/data/my.app.package/files/yourTempFile 08-16 00:33: 28.113: ПРЕДУПРЕЖДЕНИЕ / МОЙ ЖУРНАЛ :: URI (12896): file: ///data/data/my.app.package/files/yourTempFile - person oviroa; 16.08.2011
comment
если (imageUri == null || imageUri.toString (). length () == 0) {log.v (sherif, imageUri); } - person Sherif elKhatib; 16.08.2011
comment
это отображает либо null, либо. не уверен, в чем дело. - person oviroa; 16.08.2011

@Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        dir =new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/MyImages");
        dir.mkdir();
        filename = ("Image_" + String.valueOf(System.currentTimeMillis()) + ".poc");
    }

protected Uri getTempFile()
    {
        File file = new File(dir,filename);
        muri = Uri.fromFile(file);
        return muri;
     } 


    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        menu.add("Pick Image");
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
         // TODO Auto-generated method stub
         super.onOptionsItemSelected(item);
         openOptionsChooseDialog();
         return true;
    }

 private void openOptionsChooseDialog()
    {
            AlertDialog.Builder builder = new AlertDialog.Builder(AppActivity.this).setTitle("Select Image").setItems(items, new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, int item)
                {
                    Intent intent = new Intent();
   intent.setAction(Intent.ACTION_PICK);
                        intent.setType("image/*");
                        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempFile());
                        startActivityForResult(intent, SELECT_PICTURE);
 }

            });
            final AlertDialog alert = builder.create();
            alert.show();
  }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);

        switch(requestCode)
        {
case SELECT_PICTURE : if (resultCode == RESULT_OK) 
            {
                  filepath = muri.getPath();
                  Toast.makeText(this, filepath, Toast.LENGTH_SHORT).show();
                //can do bla bla bla...
            }

Я использовал тот же подход, и он работает. Надеюсь, это может помочь и вам.

person Geetanjali    schedule 16.08.2011
comment
Это не ответ на мой вопрос. Вы загружаете файл локально в / MyFiles с отметкой времени в имени файла, но не получаете никакой идентификационной информации Picasa. Я не хочу загружать файл локально, мне просто нужен url-адрес соответствующего файла в Picasa, чтобы я мог сохранить его и использовать позже. Это должно работать, когда пользователь не в сети, поэтому для целей тестирования в режиме полета. - person oviroa; 16.08.2011